Thread wird sporadisch nicht mehr aufgerufen
-
CrazyPlaya schrieb:
Ok hab es gefunden. Dort steht er an einer WaitForSingleObject welche auf ein Event wartet welches das Beenden eines anderen Threads bekannt gibt.
Lass mich raten: Dieses WaitForSingleObject steht in "//.. do Something", und der andere Thread benutzt dieselbe Critical Section?
-
Bzw. Es steht in einer Funktion welche innerhalb von Do Something aufgerufen wird. Somit wird es ja von Critical Section miteingeschlossen.
-
Ist dir denn klar, was passiert, wenn du an dieser Stelle auf einen Thread wartest, der nicht weiterlaufen kann, weil er auf diese Critical Section wartet?
-
Ehrlich gesagt nicht wirklich
-
Ein Deadlock. Keiner der beiden Threads kann weiterlaufen, weil er auf den jeweils anderen wartet.
-
Hab ich mir gedacht dass ich hier meinen Deadlock finde. Aber danke für die Unterstützung, da wäre ich alleine wahrscheinlich nicht so schnell hintergekommen. Muss ich nur noch schauen wie ich das löse

-
Jemand einen Tipp für mich? Also innerhalb meines ersten Threads starte ich einen neuen Thread einer anderen Klasse. Um den neuen Thread zu stoppen gibt es eine Methode do_stop(). Diese sendet ein Event welches darauf hinweisen soll, dass der Thread beendet werden soll.
//Thread der anderen Klasse. while(!bStop) { if(WaitForSingleObject(m_hEventStopThread, 0) == WAIT_OBJECT_0) { bStop = true; break; } else { //Do Something } } SetEvent(m_hEventThreadHasTerminated): ExitThread(0);Nach dem setzen des Stop Events wartet meine Methode auf das Event m_heventThreadhasTerminated und zwar INFINITE. Hier überschneiden sich dann die beiden Threads.
Was kann man tun, das der erste Thread welcher den neuen Thread aufgerufen hat solange warte bis der neue Thread sich beendet und den Event hasTerminated ausgelöst hat?
-
Dein wartender Thread darf halt nichts blockieren was der Thread der terminieren soll benutzen will.
Warum verwendest Du ExitThread und CreateThread? Bist Du scharf auf Memory-Leaks?
Ein rteurn ist hier sicherlich angebrachter...http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/
-
und ich such schon die ganze Zeit wie ein verrückter woher die Memory Leaks kommen könnten.
Warum bleiben denn da soviele Leaks übrig?
-
Weil Du evtl. noch anderes nicht freigibst...
-
Und beginthreadex macht dieses?
-
Nein beginthreadex sorgt zumindest für ein kontrolliertes Anlegen/Zerstören threadlokalen CRT Daten.
Wenn Du die MFC verwendest solltest Du AfxBeginThread verwenden.
http://blog.m-ri.de/index.php/2008/02/28/afxbeginthread-versus-_beginthreadex/