getmessage nachrichten filtern...
-
Hallo,
Die Parameterliste von GetMessage(...) ist wie folgt: BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, // first message UINT wMsgFilterMax // last message ); Mit Hilfe von wMsgFilterMin und wMsgFilterMax kann man die eingehenden Nachrichten filtern.Ich verstehe das nicht so recht, ich möchte, dass der Aufruf von Getmessage nur auf 3 von 7 oder 8 Möglichen Messages wartet. Aber getmessage erwartet irgendwie einen Minimumswert und Maximumswert als Filter...
Wie kann ich da gezielt auf Messages lauschen, bzw gezielt Messages ignorieren?
Also z.B:
uint msg0 = RegisterWindowMessage("msg0"); uint msg2 = RegisterWindowMessage("msg2"); uint msg3 = RegisterWindowMessage("msg3"); uint msg4 = RegisterWindowMessage("msg4"); uint msg5 = RegisterWindowMessage("msg5"); //... MSG msg; GetMessage ( &msg , NULL , 0, 0); //der reagiert so auf alles //soll aber nur bei msg0, msg3 und msg4 weitermachen...Weiss jemand wie/ob das geht?
Gruss
R
-
Frage wäre warum möchtest Du das?
Möglich wäre einfach Du verwendest PeekMessage und schaust nach ob da eine entsprechende Nachricht ist. Allerdings musst Du das auch hier mit einem Filter machen. Wenn Du 4 verschiedene Nachrichten abfragen möchtest die keine durchgehenden IDs haben dann musst Du eben min und max Wert des Filters auf jeweils den zu prüfenden Nachrichten Wert setzen.
-
Martin Richter schrieb:
Frage wäre warum möchtest Du das?
Nunja, ich möchte halt, dass der Workerthread, der die Nachricht erhält, entsprechend arbeitet.
Martin Richter schrieb:
Möglich wäre einfach Du verwendest PeekMessage und schaust nach ob da eine entsprechende Nachricht ist. Allerdings musst Du das auch hier mit einem Filter machen. Wenn Du 4 verschiedene Nachrichten abfragen möchtest die keine durchgehenden IDs haben dann musst Du eben min und max Wert des Filters auf jeweils den zu prüfenden Nachrichten Wert setzen.
Dann kann ich aber nur auf eine einzige Nachricht warten, stimmts?
Kann ich denn davon ausgehen, dass wenn ich die Nachrichten wie oben registriere diese dann fortlaufende Ids haben?
Ansonsten muss ich wirklich selber einen "Filter" programmieren..... der im Zweifel etwas ineffizienter ist, als das was ich gerade versuche....
Also sowas:do {GetMessage ( &msg , NULL , 0, 0);} while (msg.message==msg2); //ignore msg2Gruss
R
-
Überleg lieber ob du es nicht ganz anders machen kannst.
-
Verwende doch z.B. Events. Dann kanst Du einfach kontrolieren ob diese eingetreten sind.
Wenn es um simple flags geht würde sogar eine Variable langen.Du kannst PeekMessage verwenden, wie ich es schon schrieb. GetMessage blockiert wenn keine Nachricht vorhanden ist. PeekMessage kannst Du direkt verwenden und die Nachricht auch aus der Nachrichtenschleife entfernen.
-
An Events hatte ich zuerst auch gedacht, aber ich möchte den Threads ja gezielte Anweisungen schicken, und nicht an alle gleichzeitig.
Oder kann ich ein Event an nur einen von vielen Threads schicken?Gruss
R
-
Du willst Workerthreads eine Nachricht senden?
Verwende odch dazu eine eigene entsprechende Klasse bei der jeder Thread seine eigene Instanz hat. Entsprechend müsste jeder Thread eben seinen eigenen Satz an Events haben...
-
Danke, aber ich mache das jetzt wie in Posting 3.
Wenn ich für eine vorher unbekannte Anzahl an Workerthreads immer wieder neue Events registrieren muss wird mir das nachher zu kompliziert.
So schicke ich einfach an den betreffenden Thread "tudies" und "tudas" anstatt erstmal heraussuchen welches Event denn für den entsprechenden Thread dem gewünschten "tudies" oder "tudas" entspricht, es dann setzen, un im Thread dann wieder zu löschen.
Noch ein Punkt wieso ich keine Events genommen hab: Events sind Systemweit zu "hören". So bekommt nur der entsprechende Thread Nachricht. (Die meiste Zeit schlafen die sowieso mit getmessage).Dennoch eine interessante Anregung insbesondere für eine geplante Autospeicherungsfunktion die alle 15 Minuten Ergebnisse abspeichert. Da könnte ich ja einen Timerthread der vielleicht so aussieht
Pseudocode:
[ccp]
while (true)
{
Sleep(7500);
setEvent();
Sleep(7500);
removeEvent();
};
[/cpp]Oder ähnlich....
Dann müsste ich aber auf GetMessage und den Event lauschen...argh.
Ich hoffe das geht mit Waitformultipleobjects()....Gruss
R