2016-06-01 6 views
0

Ich möchte bestätigen, was ich für wahr halte. Wenn ich Windows SendMessage() benutze, handelt es sich um einen deterministischen Aufruf, der sofort ausgeführt wird (wird erst zurückgegeben, wenn die Nachricht verarbeitet wird), im Gegensatz zu PostMessage(), das nicht deterministisch ist, da es von jeder anderen Nachricht vorweggenommen werden kann die Warteschlange zu diesem Zeitpunkt (in der Tat wird es nicht ausgeführt, bis es die Nachrichtenschleife trifft).Windows-Nachrichten und ihre deterministischen Eigenschaften

Ist das eine faire Einschätzung, oder fehlt mir etwas?

Antwort

0

Das gilt im Wesentlichen für In-Prozess-Anrufe. Prozessübergreifend SendMessage funktioniert ähnlich, aber die Verarbeitung der Nachricht beginnt nicht, bis der Empfängerprozess GetMessage (oder seine Verwandten) aufruft.

Ihr UI-Thread hat eine Nachricht Pumpe, die wie etwas aussieht:

while (GetMessage(&msg)) 
    DispatchMessage(&msg); 

Postmessage bewirkt, dass die Nachricht setzen auf die Nachrichtenwarteschlange werden. GetMessage entfernt die älteste Nachricht aus der Warteschlange (FIFO *).

DispatchMessage bewirkt, dass der mit dem Zielfenster der Nachricht verknüpfte WndProc mit der Nachricht aufgerufen wird.

SendMessage umgeht diese Kette im Grunde und ruft WndProc direkt (mehr oder weniger) auf.

Viele Standardfenstermeldungen führen zu einer Kette von SendMessage-Aufrufen, bei denen das Senden einer Nachricht eine andere sendet, die eine andere sendet. Diese Kette wird oft als "der aktuelle Versand" bezeichnet. Wenn Sie möchten, dass Ihre Nachricht innerhalb der Kette verarbeitet wird, verwenden Sie SendMessage. Wenn Sie nach Abschluss des aktuellen Versands eine Bearbeitung benötigen, verwenden Sie PostMessage.

Sie können ein Tool wie Spy++ verwenden, um Windows Messaging in Aktion zu sehen, oder um Probleme zu beheben, die Sie mit der Nachrichtenreihenfolge von Operationen haben.

[*] Es handelt sich nicht unbedingt um eine FIFO-Warteschlange, da bestimmte Arten von Nachrichten (d. H. Zeitgeber, Maus, Tastatur) nicht tatsächlich in die Warteschlange gestellt werden, sondern im laufenden Betrieb generiert werden. Der Einfachheit halber kann man es sich als FIFO vorstellen.

Verwandte Themen