Threads und übergebene Klasse
-
Hi an alle,
ich habe in einer Klasse einen Thread implementiert, welchem ich die Klasse selbst als Parameter übergebe.
class xyz { static DWORD WINAPI ThreadProc(PVOID pParam); / Deklaration der Thread Prozedur }; //Aufruf des Threads HANDLE hThread = CreateThread(NULL, 0, &ThreadProc, this, 0, &dwId);Funktioniert auch alles soweit ganz gut.
Jetzt möchte ich aber einen Member der Klasse im Thread ändern und die Änderung in einer Klassenmethode abrufen. Dies funktioniert in der Debug - Version bestens wenn ich aber in den Release Modus gehe und dieses dort mache, kann er den Wert aus dieser Variable nicht mehr lesen. Woran kann das liegen was wird da weg optimiert?Der Thread laüft die ganze Zeit im Hintergrund und empfängt Nachrichten von einem Server. Bei einer bestimmten Nachricht soll er in der Klasse etwas ausführen.
Gruß
Karsten
-
An Deinem Code Beispiel sehe ich das so nicht, dass Du hier eine Klasse übergibst. Du übergibst nur einen Zeiger auf ein DWORD.
Bist Du sicher, dass der Datenbereich auch für den Thread lange genug existiert?
BTW: CreateThread gehört nicht in ein MFC Programm. Bitte verwende immer AfxBeginThread. Und wenn es Dich nach niederen Gefilden gelüstet verwende _beginthreadex!
http://blog.m-ri.de/index.php/2008/02/28/afxbeginthread-versus-_beginthreadex/
-
Hi Martin,
ja der Datenbereich exisitiert lange genug. Wie gesagt in der Debug Version funktioniert es ja auch. und alle anderen Sachen, welche über den Thread laufen funktionieren ja auch. Einizg die Sache mit dem Setzen der Member aus der Klasse. Das klappt halt nicht.
Also im Thread kann ich aber den Parameter auf die Klasse casten
CMyClass* pClass = (CMyClass*)pParam; //funktioniert zumindest in der Debug Versionund habe dann alle nötigen Werte der Klasse da. Da der Thread mit vielen Methoden der Klasse arbeitet und nur eine einzige, welche einen Klassenwert verändert bin ich ziemlich sicher, dass der übergebene Parameter korrekt läuft.
Aber ich werde mal auf AfxBeginThread wechseln, da hast du schon recht.
-
Der Compiler optimiert hier mit Sicherheit nichts weg, da er ja keine Rückschlüsse über den datenbereich erlauben kann auf den lParam verweist.
BTW: Wenn Du eine Klasse von CWinThread ableitest und einfach InitInstance überschreibst, dann bekommst Du Deine Klasse inkl. Memberfunktionen gratis, zusätzlich das einfache Erzeugen via AfxBeginThread(RUNTIME_CLASS(...)...);
-
Ist das die einzige Möglichkeit? Da das ne Menge Aufwand bedeuten würde und soviel Zeit hab ich gerade nicht.
Aber schon mal gut zu wissen dass es nichts mit wegoptimieren zu tun hat.
-
Menge Aufwand wieso? Was denkst Du denn da?
Das ist keckseinfach:
class CMyClass : public CWinThread { public: DECLARE_DYNCRATE(...) CMyClass(); BOOL InitInstance(); }; IMPLEMENT_DYNCRATE(...) ... BOOL CMyClass::InitInstance() { // my Thead code ... // Done and exit thread return FALSE; } ... AfxBeginThread(RUNTIME_CLASS(CMyThread)),...);
-
Ich hab das Problem erstmal provisorisch gelöst.
Der abzufragende Wert war vorher ein int Variable, damit ging es nicht, jetzt wird der Wert einfach in einen String geschrieben und es klappt, das ist finde ich aber recht seltsam, an der Art und Weise wie ich den Wert handle hat sich ja nichts geändert.
-
Wenn du innerhalb deines Threads auf Member und Methoden der Parent-Klasse zugreifen möchtest (du übergibst dem Thread den this-Pointer deiner Parent-Klasse und castest ihn im Thread - richtig?), dann achte auf die Zugriffsart (pulic, protected bzw. private). Wenn du auf private Methoden/Member zugreifen möchtest, dann geht es nur, wenn du die Thread-Funktion als friend deklarierst
-
Die Variable ist schon public deklariert.
Ich denke ich hab da noch irgendwo einen Speicherfehler der die var einfach überschreibt.
-
Du greifst in einen Thread auf Daten eines anderes Threads zu? Wenn ja: hast du den Zugriff auch sicher gemacht (zum Beispiel über einen Mutex-Lock)?
Gruß Kimmi
-
Upps nööhhh:D.
Verdammt da hab ich gar nicht dran gedacht:(.