Threadende erfassen
-
Hi Leute
Ich habe eine auf Dialogfelder basierende MFC. Um die Oberfläche während dem Funktionsablauf ansprechen zu können habe ich einen Thread erstellt. Das Problem, das sich ergibt ist, dass ich jetzt den erhaltenen String nicht mehr ausgeben kann, da das aus dem Thread heraus nicht möglich ist (als das alles in einer Funktion war, die kein Thread darstellte, war das natürlich kein Problem).
Wie kann ich das Threadende erfassen und dann direkt daran in einer Funktion meiner Klasse, in der auch das Ausgabefenster ist, weiterarbeiten?
-
du machst folgendes:
- Membervariable vom Typ Control für dein Ausgabefeld anlegen
- Dialogfensterzeiger (nach LPVOID gecastet) an den Thread übergeben
- im Thread den LPVOID Zeiger wieder in einen Dialogfensterzeiger casten
- dann im Thread:UINT Dlg::ThreadFkt(LPVOID Zeiger) { DLG* dialog = static_cast<DLG*>(Zeiger); //LPVOID Zeiger in einen Dialogfenster Zeiger casten //diverser code... dialog->m_MembervarVomTypControl->SetWindowText("Hallo Thread- Welt"); }
-
Super, du meintest wohl:
dialog->m_MembervarVomTypControl.SetWindowText("Hallo Thread- Welt");aber damit hats danna uch geklappt, danke!
-
CWnd Objekte sollten niemals über Thread Grenzen weitergegeben werden.
Zudem hat Deine Aktion ein massives Problem: Wenn der Main Thread gerade keine Nachrichtenschleife ausführt, dann wird Dein SetWindowText solange stehen bleiben bis die entsprechende Nachricht aus der Message Queue abgeholt wurde.
-
Stefan_Walter schrieb:
Super, du meintest wohl:
dialog->m_MembervarVomTypControl.SetWindowText("Hallo Thread- Welt");aber damit hats danna uch geklappt, danke!
Ja genau so hab ich's gemeint.
Martin Richter schrieb:
CWnd Objekte sollten niemals über Thread Grenzen weitergegeben werden.
Zudem hat Deine Aktion ein massives Problem: Wenn der Main Thread gerade keine Nachrichtenschleife ausführt, dann wird Dein SetWindowText solange stehen bleiben bis die entsprechende Nachricht aus der Message Queue abgeholt wurde.
Wie könnte man es sonst noch machen? Ich hab das sogar in meinem Studium so gelehrt bekommen
*iritiert ist*
-
Sende eine benutzerdefinierte Nachricht aus dem Thread an Deinen Dialog. Du kannst dann aus der Nachrichtenschleife Deines Dialogs direkt auf das Threadende reagieren.
Alternativ kannst Du am Ende Deines Threads ein Event (bei MFC CEvent) setzen, auf den Dein Dialog mit WaitForSingleObject wartet. Dann hättest Du aber den Teufel mit dem Beelzebub ausgetrieben, weil dann Dein Dialog wieder blockiert ist.

-
Chris++ schrieb:
Wie könnte man es sonst noch machen? Ich hab das sogar in meinem Studium so gelehrt bekommen
*iritiert ist*1. Nur HWNDs übergeben.
2. Datenaustausch mit anderen Fenstern nur vornehmen wenn unbedingt notwendig.
Während des Threads oft unnötig.
3. Habe ich das als Anmerkung geschrieben, weil die wenigsten begreifen, dass durch SendMessage autoamtisch eine Thread Synchronisation erzwungen wird und dies extrem leicht zu Deadlocks führen kann! Nur mal als Beispiel. MainThread macht WaitforSingleObject, Worker-Thread schickt Nachricht an den Main-Thread == Deadlock!