Dany (Member)
Pro
Messaggi: 129
Iscritto: 03/05/2012
|
Ho una funzione con questi argomenti:
Codice sorgente - presumibilmente C++ |
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++ |
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 |
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
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
|
|
Dany (Member)
Pro
Messaggi: 129
Iscritto: 03/05/2012
|
Grazie mille, comunque ho provato cosė:
Codice sorgente - presumibilmente C/C++ |
struct arguments
{
SDL_Surface *screen;
int x,y;
int raggio, potenza;
};
/***********************/
SDL_Thread *thread;
arguments argo;
argo.screen=screen;
argo.x=astronave::x;
argo.y=astronave::y;
argo.raggio=250;
argo.potenza=40;
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.
|
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
Codice sorgente - presumibilmente Plain Text |
thread=SDL_CreateThread(Illuminazione,(void*) &argo);
|
|
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
ah e poi la funzione Illuminazione deve avere come parametro un puntatore alla struttura arguments...
|
|
Dany (Member)
Pro
Messaggi: 129
Iscritto: 03/05/2012
|
Ho fatto cosė:
Codice sorgente - presumibilmente C/C++ |
int Illuminazione (arguments *argo)
|
e poi
Codice sorgente - presumibilmente Plain Text |
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 |
|
carlduke (Member)
Pro
Messaggi: 153
Iscritto: 29/01/2011
|
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++ |
int illuminazione(void *data)
{
arguments *arg = (arguments*)data;
. . .
}
|
e quindi fai un casting interno alla funzione da void* ad arguments*
|
|
Dany (Member)
Pro
Messaggi: 129
Iscritto: 03/05/2012
|
Grazie mille ad entrambi, funziona!
|
|
Dany (Member)
Pro
Messaggi: 129
Iscritto: 03/05/2012
|
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%.
|
|