
Code: Alles auswählen
SDL_Thread *SDL_CreateThread (int (*thread_func)(void*), void *thread_parameter);
Code: Alles auswählen
int thread_func(GameManager*,void*)
Ein Beispiel:
Code: Alles auswählen
struct parameter {
char eins[3];
char zwei[3];
};
int stupid (GameManager* the_app, void* parm) {
struct parameter *parm_str = (struct parameter*) parm;
std::cout << parm_str->eins << parm_str->zwei << the_app->getName();
return 0;
}
// ...
GameManager app;
struct parameter *parm = new struct parameter;
parm->eins = "ab";
parm->zwei = "ba";
app.addThread(stupid,parm);
// ...
In der Methode addThread soll der SDL_Thread erstellt werden.
Jetzt hab ich mir gedacht, ich bastle mir ein Übergabestrukt wei z.B.
Code: Alles auswählen
typedef struct {
GameManager *app;
void *parm;
int (*thread_func)(GameManager*,void*);
} ThreadParm;
thread_starter liest das Strukt aus und startet die eigentliche Threadfunktion, dafür aber mit den richtigen Parametern.
Nun mein Problem:
Code: Alles auswählen
// in addThread
ThreadParm *parm = new ThreadParm;
parm->app = this;
parm->parm = thread_parm;
parm->thread_func = thread_func;
unsigned int ret = SDL_CreateThread(thread_starter,parm);
Der thread_starter sieht so aus:
Code: Alles auswählen
int thread_starter (void *parmstr) {
ThreadParm *parm = (ThreadParm*) parmstr;
parm->thread_func(parm->app,parm->parm);
delete parm;
return 0;
}
Wie bekomm ich das hin, das ich keine Speicherlecks hab?
Ich hatte mir schon gedacht, dass ich evtl einen zweiten Thread starte, der darauf wartet, das der erste beendet wird und dann das Übergabestrukt löscht, aber wäre das nicht etwas zu viel an Threads?
Ich könnte natürlich auch das hier versuchen:
Code: Alles auswählen
// in addThread
ThreadParm parm;
parm.app = this;
parm.parm = thread_parm;
parm.thread_func = thread_func;
unsigned int ret = SDL_CreateThread(thread_starter,&parm);
Oder?

Hilfe?
@fat-lobyte: Geht das vielleicht besser mit boost?