Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Multithread SDL
Forum - C/C++ - Multithread SDL

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 21:13
Sabato, 09/02/2013
Ho una funzione con questi argomenti:
Codice sorgente - presumibilmente C++

  1. void Illuminazione (SDL_Surface *screen, int x, int y, int raggio, int potenza) ;


Vorrei esegurla su un thread parallelo ma guardando in giro non ho capito come funziona questa funzione:
Codice sorgente - presumibilmente C/C++

  1. SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);


In quanto in tutti gli esempi che ho trovato la funzione da eseguire aveva un solo paramentro.
Suggerimenti? Grazie in anticipo :):)


PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 9:04
Domenica, 10/02/2013
Ciao!

void* data è un puntatore che la funzione SDL_CreateThread passa alla tua funzione, se tu vuoi passargli più "parametri" fai una struct e la passi in data.

Ciao ;)


... sei un proxy che perde i pacchetti ...
PM Quote
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 12:49
Domenica, 10/02/2013
Grazie mille, comunque ho provato così:
Codice sorgente - presumibilmente C/C++

  1. struct arguments
  2. {
  3.         SDL_Surface *screen;
  4.         int x,y;
  5.         int raggio, potenza;
  6. };
  7. /***********************/
  8. SDL_Thread *thread;
  9.  
  10. arguments argo;
  11. argo.screen=screen;
  12. argo.x=astronave::x;
  13. argo.y=astronave::y;
  14. argo.raggio=250;
  15. argo.potenza=40;
  16.        
  17. thread=SDL_CreateThread(Illuminazione,argo);


E mi dice:
error C2664: 'SDL_CreateThread': impossibile convertire il parametro 1 da 'int (__cdecl *)(SDL_Surface *,int,int,int,int)' a 'int (__cdecl *)(void *)'
1>          Nessuna delle funzioni dell'ambito corrente aventi questo nome corrisponde al tipo di destinazione.
Ed inoltre che non è possibile convertire da arguments a void.
Sicuramente ho frainteso, mi devi scusare.:(


PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 13:05
Domenica, 10/02/2013
Codice sorgente - presumibilmente Plain Text

  1. thread=SDL_CreateThread(Illuminazione,(void*) &argo);



... sei un proxy che perde i pacchetti ...
PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 13:06
Domenica, 10/02/2013
ah e poi la funzione Illuminazione deve avere come parametro un puntatore alla struttura arguments...


... sei un proxy che perde i pacchetti ...
PM Quote
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 23:03
Domenica, 10/02/2013
Ho fatto così:
Codice sorgente - presumibilmente C/C++

  1. int Illuminazione (arguments *argo)



e poi

Codice sorgente - presumibilmente Plain Text

  1. thread=SDL_CreateThread(Illuminazione,&argo);



Ma l'errore persiste riguargo il parametro 'illuminazione'.
Scusa se te lo chiedo, ma potresti scrivermi come dovrei fare? Grazie mille:hail:


PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 12:31
Lunedì, 11/02/2013
la funzione illuminazione deve restiuire un int e avere come argomento un puntatore a void quindi dichiarala in questo modo


Codice sorgente - presumibilmente C/C++

  1. int illuminazione(void *data)
  2. {
  3.    arguments *arg = (arguments*)data;
  4.  
  5.    
  6.   . . .
  7. }



e quindi fai un casting interno alla funzione da void* ad arguments*
:k:


Il mio canale: http://www.youtube.com/user/MrDukeCarl

tecnologia e programmazione!
PM Quote
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 17:51
Lunedì, 11/02/2013
Grazie mille ad entrambi, funziona!


PM Quote
Avatar
Dany (Member)
Pro


Messaggi: 129
Iscritto: 03/05/2012

Segnala al moderatore
Postato alle 21:17
Giovedì, 21/02/2013
Mi spiace risollevare la questione, ma ho un'altra seccatura: quando eseguo la funzione con il thread, funziona a tratti, ovvero se quando la eseguo normalmente crea un'alone attorno ad un punto, se la lancio tramite thread questo è discontinuo. Inoltre una volta avviato, l'utilizzo CPU arriva al 100% mentre normalmente il processo ne occupa un 30-35%.


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo