PostQuitMessage - Verschiedene Threads
-
Mein Hauptprogramm, welches die Eingaben annimmt, startet einen Thread mit einer eigenen Nachrichtenschleife.
class Work { void Run(void); void Stop(void); }Die Run-Methode wird in einem Thread gestartet und sollte mit der Stop-Methode abgebrochen werden können. Dazu wird dort PostQuitMessage() aufgerufen.
Stop wird jetzt ausserhalb des Threads aufgerufen. Dadurch kann PostQuitMessage die Nachrichtenschleife aber nicht mehr beenden, da sie in einem anderen Thread liegt.Gibt es eine schöne Möglichkeit das Problem zu lösen?
PostThreadMessage(ThreadId, WM_QUIT) soll man laut http://blogs.msdn.com/oldnewthing/archive/2005/11/04/489028.aspx nicht verwenden.
-
du kannst eine andere abbruchbedingung einbauen. z.b. thread läuft:
while(run) ...bis
Stop() { run=false;
...
gedingst wird.
grüssli.
-
Darauf dass ich in der Schleife neben dem GetMessage noch auf eine weitere Variable prüfen kann wäre ich nie gekommen. Die Lösung ist so einfach, das ist ja schon fast peinlich

-
Main:
::PostThreadMessage(...)Thread reagiert auf die msg mit:
::PostQuitMessage(0);
-
Das ist auch gut. So könnte ich das Polling durch PeekMessage verhindern.
-
So nun hab ich bemerkt, das alles doch nicht so einfach ist. Es geht im Prinzip darum Hotkeys zu registrieren, deren Nachrichten dann in dem Messageloop empfangen werden. Doch leider werden dann die Hotkeys welche ich im Hauptthread durch Benutzereingaben registriere natürlich auch nicht an den 2. Thread mit dem Loop geschickt.
Jetzt hab ich mir überlegt das ich das doch wieder mit PeekMessage mache und prüfe ob eine Windowsnachricht vorliegt oder eine Nachricht aus einer art prozessinternen meesagequeue mit der ich nachrichten von dem 1. an den 2. thread schicke.
Gibt es vielleicht noch eine andere Möglichkeit mit der ich das Polling vermeiden kann?
Oder kennt jemand eine gute Seite/ein Tutorial in dem sollte Thread-Kommunikationsmethoden für Windows beschrieben werden?
-
Vielleicht würde es reichen wenn du dem 2. Thread ein Fenster spendierst?
Ist nicht unüblich versteckte (=unsichtbare) Message-Windows anzulegen, zu dem Zweck eben Nachrichten zu empfangen die nur an Fenster geschickt werden.
-
Das ganze ist eigentlich ein Konsolenprogramm und das sollte es wenn möglich auch bleiben.
-
Was meinst du dann mit Hotkeys?
*grübel*
-
Ich empfange in der Konsole mit GetMessage() die WM_HOTKEY Nachrichten die ich mit RegisterHotKey() anlege.
EDIT - Für alle die es interessiert:
Ich habe jetzt die tolle Funktion MsgWaitForMultipleObjects gefunden. Mit der erreiche ich genau was ich wollte.