Threads Beenden durch eine Aufgerufene Funktion
-
Guten Abend,
Ich habe mir Heute den Ganzen tag den Kopf über folgendes Problem zerbrochen:
Es gibt ein Programm mit Mehreren Threads, einer Davon sucht in einem Verzeichniss nach einer Stopdatei, wenn diese vorhanden ist soll er das ganze Programm Beenden.
Das Beenden wird von einer Unterfunktion ausgeführt, die entweder von einem Ende Knopf oder vom besagten Thread (Loop Thread oder Polling Thread) aufgerufen wird.
Mit dem Beenden Knopf funktioniert das Beenden einwandfrei.
jedoch ruft der Loop Thread zum Beenden die Unterfunktion auf, die wiederum den Loop Thread (im MFC Modul OnOK) zu Beenden versucht.
zur Verdeutlichung:
//Loop Thread //.... BeendeAlles(); --> Ruft MFC Funktion OnOK auf wo alles Beendet wird BeendeDichSelbst();Ein Thypisches Laufzeitproblem Da die BeendeAlles Funktion ja auf was wartet was erst erreicht werden kann wenn Die BeendeAlles Funktion selbst fertigestellt ist.
Ich habe sehr wenig erfahrung mit MFC (aber gute c++ Kentnisse) und weis nicht genau wie ich zur Lösung Beispielsweise aus der OnOK funktion die warte auf Loop Tread ausklammern könnte.
Andererseits würde mir als alter Konsolenguru ein Aufrufen der Mainfunktion mit einem Event zusagen, da die Mainfunktion warten kann bis sich der Loop Thread Beendet hat und sich anschließend selbst beenden.
an die Dritte Möglichkeit, die Durch ein Abschuß des Loop Threads in der BeendeAlles Funktion den Loop Thread beendet habe ich auch schon gedacht, weis aber nicht genau wie man ein Thread Zwangsbeendet ohne Speicherlecks zu hinterlassen.
Wer von euch hat Ideen dazu oder gar ganz neue Konzepte und würde mich damit aufmuntern ?
Ich hoffe ich habs nicht zu Kompliziert Dargestellt
Fisch
-
Du übergibst deinem Thread einen Zeiger auf deine Haupt CWnd Klasse. Über den Zeiger schickst du per PostMessage eine eigene Nachricht, welche per ON_MESSAGE abgearbeitet wird. Du könntest natürlich auch z.b. direkt WM_CLOSE schicken. Mit WaitForSingleObject kannst du auf einen Thread, mit dem entsprechenden HANDLE, warten bis er beendet wurde. Wenn du einen Thread per AfxBeginThread startest, dann kannst du den Zeiger des Threads speichern (CWinThread). Das Handle bekommst du dann über die Member-Variable m_hThread.
Um mit Events umgehen zu können schaust du dir vielleicht mal CEvent an. Auch auf ein CEvent kannst du mit WaitForSingleObject warten. Es gibt allerdings auch CSingleLock bzw. CMultiLock.Allgemein zu dem Thema kannst du mal in der MSDN nach Multithreading suchen.
Alles was Fett markiert ist, sind Stichwörter für die Suche in der MSDN oder sonst wo.
Grüssli und viel Glück