SendMessage против PostMessage + WaitForSingleObject - PullRequest
10 голосов
/ 21 июля 2011

Мне было интересно, в чем разница между вызовом SendMessage (который блокирует) и вызовом PostMessage в сочетании с WaitForSingleObject. Мысли

Ответы [ 4 ]

18 голосов
/ 21 июля 2011

SendMessage() может быть отклонено, если вы вызываете его из контекста COM-вызова, где COM-объект находится в STA (вызовы отправляются через насос сообщений). PostMessage() не ограничивается соблюдением правил квартир COM.

Кроме того, PostMessage() помещает сообщение в конец очереди сообщений окна. SendMessage() обходит очередь. Более подробное обсуждение очередей сообщений можно найти в блоге Рэймонда Чена The Old New Thing .

Моя точка зрения заключается в том, что разница между SendMessage() и PostMessage() больше, чем кажется на первый взгляд. Я действительно рекомендую просмотреть блог Рэймонда, так как он охватил многие ошибки за эти годы.

4 голосов
/ 21 июля 2011

PostMessage и WaitForSingleObject позволяют выполнять асинхронный обмен сообщениями.Вы можете отправить сообщение, заняться другими делами и проверить ответ позже.SendMessage синхронно и требует от вас ожидания.

3 голосов
/ 21 июля 2011

Я всегда думал, что SendMessage вызывает вашу процедуру Windows напрямую, пропуская очередь сообщений;в то время как PostMessage просто добавляет сообщение в очередь.

2 голосов
/ 21 июля 2011

SendMessage - это единственный вызов API, поэтому он менее подвержен вашим ошибкам.Пойдите со встроенным, а не катите свое собственное.

...