Kommunikation in Thread
-
Hallo zusammen,
ich arbeite mit Windows Xp Prof und MS Visual C++ 6.0 / MFCZu meiner Frage:
Ich stelle eine serielle Verbindung zu einem Gerät her. Da sich darin eine Endlosschleife befindet, welche während das Programm läuft immer wieder Protokolle an das Gerät schickt, soll diese Kommunikation in einem Thread ablaufen.
Muss ich dazu etwas besonderes beachten, oder kann ich einfach z.B. einen Worker Thread starten und darin die Kommunikation aufbauen?
Und wie kann ich dann, wenn das komplette Programm beendet wird, den Thread beenden?Vielen Dank für Eure Hilfe
MfG Dippi
-
Dippi_81 schrieb:
Ich stelle eine serielle Verbindung zu einem Gerät her. Da sich darin eine Endlosschleife befindet, welche während das Programm läuft immer wieder Protokolle an das Gerät schickt, soll diese Kommunikation in einem Thread ablaufen.
Muss ich dazu etwas besonderes beachten, oder kann ich einfach z.B. einen Worker Thread starten und darin die Kommunikation aufbauen?Hallo Dippi,
beachten musst Du, dass man aus dem Worker-Thread heraus NIE auf irgendwelche Controls oder Member Deines Dialogs oder Fensters zugeifen darfst. Das mag die MFC gar nicht. Jeder Informationstransfer von Worker-Thread zu Main-Thread sollte via PostMessage geschehen.
Dippi_81 schrieb:
Und wie kann ich dann, wenn das komplette Programm beendet wird, den Thread beenden?
Ich kenne zwei Möglichkeiten, die ich beide schon angewendet habe.
1.) Einfach & Brutal: Du hast ein blockierendes Read, wenn keine Daten kommen, hängt der Thread auf dem Read. Dann sollte es möglich sein, vom Main-Thread aus die Verbindung zu beenden - Close( Handle ) oder so - und dann wird der Read mit Fehler beendet. Setzte Dir vorher noch in Flag, welches Du abfragst, wenn Du vom Read wiederkommst, so dass Du im Worker-Thread weißt, dass jetzt Schluß ist.
2.) Elegant: Nutze overlapping IO. Dann wartest Du mit WaitForMultipleObjects auch auf ein zweites Event, welches Du vom Main-Thread aus setzen kannst. Dies ist auch eine Methode, mit der Du sauber Informationen vom Main- zum Worker-Thread transportiern kannst. Nach Abfall von WaitForMultipleObjects fragst Du dann zuerst ab, ob das Read-Event oder Dein 'User'-Event gesetzt wurde und reagierst entsprechend.Tipp: Nutze boost.thread, da hast Du alles was Du dazu brauchst.
Gruß
Werner
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Werner Salomon schrieb:
...beachten musst Du, dass man aus dem Worker-Thread heraus NIE auf irgendwelche Controls oder Member Deines Dialogs oder Fensters zugeifen darfst. Das mag die MFC gar nicht. Jeder Informationstransfer von Worker-Thread zu Main-Thread sollte via PostMessage geschehen.
weshalb nie?
Ich rufe im Thread eine Methode des Dialoges auf und innerhalb dieser Methode wird dann der Dialog bzw. die Controlls davon aktualisiert. Funktioniert absturzfrei
und wenn mann mist PostMessage eine Nachricht sendet, wo und wie wird die abgefangen und ausgewertet? Mit PeekMessage steht z.B. in der MSDN, aber wo ruft man diese Methode auf? verste nix.