Thread lässt sich nicht beenden!
-
Hallo
Ich habe gerade mein erstes Progrämmchen geschrieben, dass Threads verwendet. Der Thread den Ich geschrieben habe durchläuft eine Endlosschleife und führt WaitCommEvent aus, wartet also auf ein ankommendes Zeichen, wenn eins ankommt teilt er das dem Hauptthread mit und fängt wieder von vorne an.
Nun habe ich festgestellt, dass nach dem Schließen des Fensters, die *.exe Datei weiterhin in der Liste der Prozesse aufscheint, somit mein Programm weiterläuft. Muss man Threads eigens wieder beenden?Wie? Im Petzold steht nichts davon, nur CreateThread schein auf, aber nichts zum Beenden.Vielen Dank
-
Die beste Lösung ist es, den Thread sauber auslaufen zu lassen. Dazu kannst du aus der Endlosschleife eine "normale" Schleife machen, deren Abbruchbedingung vom Hauptprogramm gesetzt werden kann:
bool ende=false //Thread: while(!ende) { if(daten_vorhanden() verarbeite_daten(); } //Hauptprogramm: ... ende=true; //eventuell mit WaitForSingleObject o.ä. darauf warten, daß der Thread wirklich fertig ist exit();(PS: Natürlich solltest du die Zugriffe auf die gemeinsame Variable synchronisieren)
-
@CStoll:
Ich weiß, dass es auch ohne geht, aber sollte die Variable ende nicht in diesem Fall volatile deklariert werden?
-
Ja, durchaus möglich - aber das war sowieso nur eine Verdeutlichung des Löungsprinzips.
(und ich würde vermutlich einen Event verwenden für die Benachrichtigung)
-
Danke Erstmal, das wär sicher eine elegante Lösung. Das Problem ist nur, dass der Thread so lange bei WaitCommEvent hängen bleibt, bis etwas ankommt und erst dann mit der Endllosschleife fortfährt. Und das kann laaange dauern. Also wird der Thread wohl oder übel unsanft beendet werden müssen, oder was meint ihr dazu?
-
Da solltest du am besten mal deine Datenverarbeitung umstellen.
*grübelt* Zum Beispiel könntest du WaitCommEvent() im Overlapped-Modus verwenden - da hast du die Möglichkeit, zwischendurch eigene Arbeiten zu erledigen.
-
Was bedeutet overlapped?
-
Schau dir doch mal den MSDN-Beitrag zu WaitCommEvent() an, da findest du eine genauere Erklärung.
In Kurzfassung: Die Funktion kehrt sofort zum Aufrufer zurück und wartet im Hintergrund auf ein Ergebnis. Wenn sie fertig ist, wird ein Event gesetzt, den du abfragen kannst, um die Eingaben entgegenzunehmen.
-
Siehe auch:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-169285-and-highlight-is-*thread*.html
und:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-169778-and-highlight-is-*thread*.html