[c++]Threads/Zeiger

kickerxy123

Erfahrenes Mitglied
Hallo!

Ich habe ein recht triviales Problem, bei dem ich wirklich nicht weiterkomme.

Ich will einem Thread mehrere Parameter übergeben. Dafür habe ich eine Struktur definiert, und eine Zeiger darauf, den ich übergeben will.
Hier der Code:
C++:
DWORD WINAPI FadeOutMusik (LPVOID data);  //Threadfunktion 


struct THREADPARAM
{
int i[10];
short anzahl_ints;
string s[10];
short anzahl_strings;
};


void fadeOutMusik(short ID, int dauer)
{
THREADPARAM param;
HANDLE hClient;

param.i[0] = ID;
param.i[1] = dauer;
param.anzahl_ints = 2;
param.anzahl_strings = 0;

     
     if(!(   hClient = CreateThread(    NULL,						    // Sicherheitsinfos
                                                  0,							// Größe des Stack
		                                          FadeOutMusik,      			// Threadfunktion
		                                          (LPVOID)&param,			    // 32-bit paramter der Threadfunktion übergeben wird
		                                          0,							// Creation Flags, 0=sofort starten.
		                                          0)))	    // Id speichern
{
writeToLog("Thread konnte nicht erstellt werden");
return;
}

//TerminateThread(hClient,10);
return;
}


DWORD WINAPI FadeOutMusik (LPVOID data)  //Threadfunktion 
{

 THREADPARAM* pparameter = (THREADPARAM*)data;
 if(pparameter != NULL)
 {
 //...
}
}
Soweit kompiliert er zumindestens. Jetzt will ich natürlich den Wert auf den der Zeiger zeigt ermitteln. Ich habe es auf mehrere Weisen versucht, u.a.
(dort wo die "//..."sind):
C++:
 THREADPARAM parameter = *pparameter;
oder auch
C++:
THREADPARAM parameter;
 THREADPARAM* ppparameter= &parameter;
 *ppparameter = *pparameter;
Beide Möglichkeiten führen zum Absturz! Was mache ich falsch?

lg und danke
kickerxy123
 
Hi.

Du übergibst dort die Adresse auf eine lokale (automatische) Variable. Sobald die Funktion zurückkehrt wird der Stack aufgeräumt und somit die Variable freigegeben.

Nutze malloc. \edit: bzw. in C++ new. Andererseits solltest du in C++ evtl. gleich Boost.Thread verwenden...

Gruß
 
aaaah, warum bin ich nicht darauf gekommen? Vielleicht weil ich bei der Zeigersache den Fehler gesucht habe ;) Auf jeden Fall danke für die gute und schnelle Antwort!
 
Zurück