Hallo,
ich hab mal wieder ein Problem:
Bei einer Threaderzeugung gehen mir Daten verloren, die… nicht sollten.
Ich habe dazu ein Objekt MyThreads, das meine Threads verwalten soll.
Mit MyThreads::createNewThread kann man so einen neuen Thread erzeugen.
Da der Windowsaufruf jedoch eine globale Funktion braucht, wird eine aufgerufen, die sofort wieder eine Objektfunktion aufruft.
Die Daten, die dabei immer übergeben werden sollen, sind jedoch weg. o_O
Hier mal ein bisschen Code zur Illustration:
/\* -- Eine einfache Datenstruktur -------------------- \*/
struct Data { int zahl, char buchstabe };
/\* -- MyThreads.cpp - Header lass ich mal weg :wink: ----- \*/
// Erzeugt einen neuen Thread, der das globale startThread aufruft
void MyThreads::createNewThread(Data\* dp)
{
CreateThread(NULL, 0, startThread,
(LPVOID)dp, 0, &newThread.dword);
}
// Globale Funktion, die von LPVOID wieder auf Data\*
// castet und die eigtl. Thread-Funktion aufruf
void startThread(LPVOID datap)
{
MyThreads\* mtRef = MyThreads::instance(); // Singleton
Data\* dp = (Data\*)datap;
mtRef-\>runThread(dp);
return((DWORD)datap);
}
// Und schlussendlich die Funktion, in dem der Thread wirklich
// arbeitet
void MyThreads::runThread(Data\* dp)
{
while(true)
{
// ... Arbeite ...
}
}
So. Das Problem ist jetzt, dass beim Casten von LPVOID nach Data* die eigentlichen Strukturdaten verloren gehen. Soll heissen, ich kann mir folgende Ausgabe erzeugen lassen:
(createNewThread) Adresse: 0x01234567, Data.zahl = 1
(startThread) Adresse: 0x01234567, Data.zahl = 1838477
(runThread) Adresse: 0x01234567, Data.zahl = 1838477
Also zeigt der Pointer zwar immer auf die gleiche Stelle, aber der Speicherbereich scheint beim CreateThread-Aufruf trotzdem freigegeben worden zu sein.
Kann man das irgendwie umgehen? Ich kenne nämlich keinen anderen Weg, einem Thread irgendwelche Daten mitzugeben…
kvida