2011-07-21 28 views

Odpowiedz

17

SendMessage() może zostać odrzucony, jeśli wywołasz go w kontekście wywołania COM, gdzie obiekt COM znajduje się w stacji STA (wywołania są wywoływane przez pompę komunikatów). PostMessage() nie jest ograniczone do przestrzegania zasad apartamentu COM.

Ponadto, umieszcza komunikat na końcu kolejki komunikatów okna. SendMessage() pomija kolejkę. Możesz znaleźć dłuższą dyskusję na temat kolejek wiadomości na blogu Raymonda Chena: The Old New Thing.

Chodzi mi o to, że różnica między SendMessage() i PostMessage() jest większa niż na pierwszy rzut oka. Naprawdę polecam przejście przez blog Raymonda, ponieważ przez wiele lat obejmował on wiele gier.

4

PostMessage i WaitForSingleObject pozwalają na wykonywanie asynchronicznych wiadomości. Możesz wysłać wiadomość, zrobić inne rzeczy i wrócić do odpowiedzi później. SendMessage jest synchroniczna i wymaga poczekać.

+0

Chyba powinienem był wspomnieć, że moim celem jest osiągnięcie synchroniczności. Zrobiłbym PostMessage i natychmiast wykonuję połączenie z WaitForSingleObject. –

+0

+1 za wyróżnienie głównej różnicy operacyjnej - Po wyświetleniu zdarzenia i oczekiwaniu na niego osoba dzwoniąca może kontynuować przetwarzanie. Może to być użyteczne, jeśli celem jest poczekanie na pewnym późniejszym etapie przetwarzania wątku, aż do momentu, gdy poprzedni wysłany komunikat zostanie w całości obsłużony w wątku GUI. –

3

Zawsze uważałem, że SendMessage wywołuje procedurę Windows bezpośrednio, pomijając kolejkę wiadomości; natomiast PostMessage po prostu dodaje wiadomość do kolejki.

+3

To zależy od tego, z jakiego wątku wywoływana jest funkcja SendMessage(). Połączenia Interthread są zawsze kierowane przez pompę i nie są wysyłane bezpośrednio do winproc. –

2

SendMessage to pojedyncze połączenie API, dlatego mniej podatne na błędy. Idź z wbudowanym, a nie toczącym się własnym.

+3

Nie chodzi o to, że jest on mniej podatny na błędy. Funkcje mają zupełnie inny cel semantyczny. Twój wybór, czy użyć jednego, czy drugiego, powinien opierać się na tym, co chcesz osiągnąć, a nie tylko na tym, jak sprawić, by kod ten "działał". –

+0

"Semantyka" dotyczy języków naturalnych. Kod to kod, a nie to, co ma znaczyć. –

+1

Nie, semantyka ułatwiająca czytanie kodu, samokomponowanie i stosowanie umów API. Tylko dlatego, że kod robi coś teraz, nie znaczy, że zawsze będzie nadal robić to samo. A fakt, że implementator wie, co robi kod, nie oznacza, że ​​późniejszy opiekun będzie wiedział, dlaczego zrobiłeś coś w sposób całkowicie nieoczywisty, nieintuicyjny. –