000
06.07.2010, 09:52 Uhr
cmos
|
Hallo, wenn ich meinen Workerthread beende, dann ist der noch im Pending-Modus. Nur ganz selten ist er wirklich beendet.
Folgend das Stück Code was den Thread erstellt.
C++: |
startEvent = ::CreateEvent(NULL, FALSE, FALSE, "startEvent"); stopEvent = ::CreateEvent(NULL, FALSE, FALSE, "stopEvent"); stoppedEvent = ::CreateEvent(NULL, FALSE, FALSE, "stoppedEvent"); thread = ::AfxBeginThread(Application::applicationThread, this, priority);
|
In der Threadproc ist eine while(TRUE) Schleife. Um ein Beenden von außen abzufangen benutze ich
C++: |
while(TRUE) { if(::WaitForSingleObject(stopEvent, 5) == WAIT_OBJECT_0) { break; } // zeug } ::SetEvent(stoppedEvent); return 0;
|
Das funktioniert auch soweit, die Threadfunktion wird verlassen. Im Hauptprogramm warte ich mit
C++: |
::AtlWaitWithMessageLoop(stoppedEvent);
|
darauf, das der Threadbeendet wird, besser gesagt, die Funktion verlassen wird, da ja am Ende das stoppedEvent gesetzt wird. Das funktioniert auch.
Nur passiert es sehr oft (zu 99%) dass, das ganze Programm nicht komplett beendet ist. Ich habe mir darauf hin mit GetExitCodeThread den Exitcode geben lassen. Und dieser ist STATUS_PENDING. Anstatt return 0 am Ende der ThreadProc habe ich auch einmal AfxEndThread(..) probiert. Aber auch da ist das gleiche Verhalten zu beobachten. Das Problem ist, dass das Programm nicht komplett beendet wird. Das merkt man daran, dass nach dem "Programmende" das Visual Studio immer noch darauf wartet das es beendet wird und das man nichts neu kompilieren oder Debuggen kann. Wenn ja, wird man gefragt, ob man den Debug-Modus verlassen möchte.
Habe ich noch etwas wichtiges vergessen ?
Grüße, cmos |