WaitForSingleObject - Thread-ende abwarten
-
Hallo,
ich habe einen Thread mit einer Endlosschleife, die über die while-Bedingung abgebrochen wird (Bei Klick auf Stoppbutton).
Ist der Abbruch erfolgt kehrt der Thread mit return 0 zurück.
In dem Ereignishändler des Stoppbuttons möchte ich auf das Thread-Ende warten.
Nun habe ich hier schon einige Hinweise über WaitForSingleObject gefunden, aber das klappt irgendwie nicht. Da passiert dann gar nix mehr.
Hier mal meine Sourcen dazu:
//Thread: UINT MyThread(LPVOID pParam) bool* ThreadEnde = (bool*) pParam; while (!*ThreadEnde) { .... } return 0; } // OnBnClickedStart: void CAppView::OnBnClickedStart() { m_EndThread = false; m_MyThread = AfxBeginThread(MyThread, &m_EndThread, THREAD_PRIORITY_NORMAL); } // OnBnClickedStop: void CAppView::OnBnClickedStop() { m_EndThread = true; WaitForSingleObject(m_MyThread->m_hThread, INFINITE); // nach ThreadEnde fortfahren }
Kann mir jemand sagen, was ich falsch mache?
Danke+Gruß
Chris
-
Nimm MsgWaitForMultipleObjects
-
Hallo,
Danke erstmal! Ich habe auf dem Gebiet noch nicht so viel Erfahrung.
Hab's jetzt so versucht, aber er hängt trotzdem:
HANDLE h[1]; h[0] = m_MyFirstThread->m_hThread; h[1] = m_MySecondThread->m_hThread; MsgWaitForMultipleObjects(2, h, TRUE, INFINITE, QS_ALLINPUT);
-
Die MSDN will Dein Freund sein, also benutze sie doch -> Dann findest Du zu dem Befehl ein Beispiel:
int MessageLoop ( HANDLE* lphObjects, // handles that need to be waited on int cObjects // number of handles to wait on ) { // The message loop lasts until we get a WM_QUIT message, // upon which we shall return from the function. while (TRUE) { // block-local variable DWORD result ; MSG msg ; // Read all of the messages in this next loop, // removing each message as we read it. while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // If it's a quit message, we're out of here. if (msg.message == WM_QUIT) return 1; // Otherwise, dispatch the message. DispatchMessage(&msg); } // End of PeekMessage while loop. // Wait for any message sent or posted to this queue // or for one of the passed handles be set to signaled. result = MsgWaitForMultipleObjects(cObjects, lphObjects, FALSE, INFINITE, QS_ALLINPUT); // The result tells us the type of event we have. if (result == (WAIT_OBJECT_0 + cObjects)) { // New messages have arrived. // Continue to the top of the always while loop to // dispatch them and resume waiting. continue; } else { // One of the handles became signaled. DoStuff (result - WAIT_OBJECT_0) ; } // End of else clause. } // End of the always while loop. } // End of function.
-
Danke erstmal Rene...
Den Beitrag hatte ich auch in der MSDN gefunden und auch versucht anzuwenden.
Mein Problem ist, dass ich über MsgWaitForMultipleObjects nicht rausbekomme, ob die Threads beendet wurden.
Reicht es, wenn ich die Threads mit return beende? Oder muss ich das ThreadEnde noch auf andere Weise signalisieren, um es mit der o.g. Fkt zu erkennen?
Gruß
Christian
-
In der FAQ habe ich eine Möglichkeit genannt um das ende eines Thread abzufragen.
Der Thread ist eine von CWinThread abgeleitete Klasse
-
Mein Problem ist, dass ich über MsgWaitForMultipleObjects nicht rausbekomme, ob die Threads beendet wurden.
Also wenn Du über WaitForSingleObject rausbekommst, ob der Thread beendet wurde, wieso sollte es dann über MsgWaitForMultipleObjects nicht gehen
-
@Unix-Tom
Mein Thread ist nicht von WinThread abgeleitet.
Und den Beitrag selbst habe ich nicht gefunden. Es ist nicht immer Einfach in der FAQ einen Beitrag zu finden, wenn man nicht genau weiß, wonach man suchen soll.
Hab nach Thread gesucht und immer noch nix gefunden.@ReneG
Ich habs mit WaitForSingleObject auch nicht rausbekommen. (vielleicht war meine Frage etwas ungenau formuliert)
Du hast mir MsgWaitForMultipleObjects (wahrscheinlich unter dem Apekt, dass das Programm in der Zeit reagieren solle) vorgeschlagen und ich habs damit versucht.Mir gehts nicht darum, dass mein Programm in der Wartezeit nicht reagiert - dass kann ruhig so bleiben.
Aber irgendwie krieg ich nicht raus, dass die Threads beendet sind und so bleiben die Wait-Fkt hängen.
Gruß
Chris
-
http://www.c-plusplus.net/forum/viewtopic.php?t=39041&highlight=setowner
http://www.c-plusplus.net/forum/viewtopic.php?t=39101&highlight=setowner
-
Danke für die Links
Da wird doch aber auch mit WaitForSingleObject gewartet - genauso, wie ich's versucht habe. Das funktioniert aber bei mir nicht.
Ich habe in meiner ViewKlasse eine Member:
CWinThread* m_MyThread.Den Thread starte ich in der View mit:
m_MyThread = AfxBeginThread(MyThread, this, THREAD_PRIORITY_NORMAL);wenn ich das Ende des Threads signalisiert habe, beendet sich dieser Thread mit:
return 0;und ich warte an der Stelle, wo ich das beenden signalisiert habe mit:
WaitForSingleObject(m_MyThread->m_hThread, INFINITE);und da passiert nix mehr. Der Thread benötigt maximal 5 sec, um nach EndeSignal wirklich zu Enden und dann sollte es doch eigentlich weitergehen oder?
Gruß
Chris