problem beim Beendung eines programms
-
Weiss jemand wieso ein Programm beim Beenden nicht als Prozess im taskmanager beendet wird?
Also ich habe eine Fkt. onClose():
Und mein Problem ist jetzt: das Programm schliesst sich, aber als Prozess nicht beendet wird. D.h man kann mein Programm "xxx.exe" noch im taskmanager sehen.void CMainFrame::OnClose() { /**** Deinitialisieren der Kommunikation ****/ pDauComClient->Disconnect(); pDauComClient->Shutdown(); //m_hDauCommThread wird beendet if (WaitForSingleObject (m_hDauCommThread, 5000) != WAIT_OBJECT_0) { TerminateThread (m_hDauCommThread,0); } CloseHandle (m_hDauCommThread); DauComWindow->DestroyWindow(); DauComWindow= NULL; /**** Ende Deinitialisieren der Kommunikation ****/ CMDIFrameWnd::OnClose(); }
Danke für das Antworten!!!!!!!!
-
Das mag daran liegen, dass zwar dein Rahmenfenster geschlossen wurde, aber deine Threads noch weiterlaufen. Prüfe doch mal nach ob sich alle Threads beenden und ob die Methode CWinApp::ExitInstance() durchlaufen wird.
-
Das problem ist aber dass der prozess manchmal beendet wird und manchmal nicht.
Die Treads werden eigentlich schon beendet.
Und ExitInstance() wird auch durchlaufen.
-
Prak schrieb:
Das problem ist aber dass der prozess manchmal beendet wird und manchmal nicht.
Die Treads werden eigentlich schon beendet.
Und ExitInstance() wird auch durchlaufen.Ich zweifle an der Methode 'WaitForSingleObject' - Guck mal, ob wirklich alle Thread beendet werden.
Ein anderer Punkt wäre die Debugversion: Ich hab' das Phänomen bereits mehrmals beobachten können, dass sich die Debug-Version nicht richtig beendet wird. Release-Version ist problemlos.
-
Wie kann ich sonst(mit welchen Funktionen) prüfen ob alle Threads richtig beendetsind?
-
Prak schrieb:
Wie kann ich sonst(mit welchen Funktionen) prüfen ob alle Threads richtig beendetsind?
Tja das ist die Frage, welche auch ich schon gestellt habe und nie eine Antwort darauf erhalten habe
Mit 'WaitForSingleObject' klingt zwar logisch, aber in der Praxis konnte ich die Methode nicht gebrauchen, ja nich teinmal die Beispiele im WWW funktionierten korrekt.Ich prüfe nun auf eine Klassenvariable (z.B. m_bThreadRunning), solange der Thread noch läuft (Variable also true ist), beende ich die App nicht. Fertig. Var erst auf false setzen, wenn Threadcode nix mehr wichtiges macht (z.b. kein Zugriff auf anderwärtig bereits zerstörte Objekte etc.) Funktioniert bei meinen Workerthreads prächtig.
// pseudo code: foo(){ m_bThreadRunning = true; BeginThread(); } OnExit(){ if(!m_bThreadRunning){ // abort thread or do nothing } else exit; } BeginThread(){ dothis(); if(!shallAbort()){ m_bThreadRunning = false; return; } // else dothat(); m_bThreadRunning = false; }
-
Wie kann man prüfen ob alle Threads beendet sind oder nicht?
Also die Fkt. ExitInstance() wird beim beenden manchmal nicht durchlaufen.
Heisst es das irgendein Thread nicht beendet ist. Oder ist es ein anderes Problem?
Kann ich die Fkt irgendwie expliziet aufrufen. Weil eigentlich macht MFC das alles.
-
Prak schrieb:
Wie kann man prüfen ob alle Threads beendet sind oder nicht?
Also die Fkt. ExitInstance() wird beim beenden manchmal nicht durchlaufen.
Heisst es das irgendein Thread nicht beendet ist. Oder ist es ein anderes Problem?
Kann ich die Fkt irgendwie expliziet aufrufen. Weil eigentlich macht MFC das alles.Siehe Code oben. Oder Dokuu lesen zu Waitforsingleobject