Übergabe mehrerer Argumente an einen SDL_Thread
Verfasst: Di Apr 14, 2009 11:09 am
Tag 
Mein Problem ist, dass ich Funktionen von folgendem Typ als Thread starten will:
Bei "GameManager" handelt es sich um eine Klasse. Der Thread soll durch eine Methode dieser Klasse gestartet werden.
Ein Beispiel:
Die Funktion stupid soll nun also als Thread gestartet werden. Sie soll als Argument einen Zeiger auf die "startende Klasse" (app) zusätzlich zu einem "normalen" void-Argument bekommen.
In der Methode addThread soll der SDL_Thread erstellt werden.
Jetzt hab ich mir gedacht, ich bastle mir ein Übergabestrukt wei z.B.
Das lasse ich nun von addThread ausfüllen und übergebe es an einen SDL_Thread, der eine Funktion "thread_starter" aufruft.
thread_starter liest das Strukt aus und startet die eigentliche Threadfunktion, dafür aber mit den richtigen Parametern.
Nun mein Problem:
Hier habe ich das Strukt ausfüllen lassen. Das Strukt wurde hier aber per new allokiert. Heißt, ich muss es auch wieder löschen.
Der thread_starter sieht so aus:
Alles schön und gut, wenn ich nun aber den Thread kille, während er noch in der eigentlichen Threadfunktion ist, dann wird das Strukt für die Übergabe nie gelöscht.
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:
Aber hier wird parm doch auf dem Stack erstellt, heißt sobald die Methode addThread fertig ist und per Return zurückgibt wird das parm wieder gelöscht.
Oder?

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

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?