SendMessage и PostMessage какой из них лучше использовать?

поискав в Интернете разницу между этими двумя вызовами функций, я обнаружил, что:

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

postMessage: отправляет сообщение в очередь сообщений, связанную с потоком, и возвращает, не дожидаясь, пока поток обработает это сообщение.

SendMessage: вызывает оконную процедуру для указанного окна и не возвращается, пока оконная процедура не обработает сообщение.

PostMessage - это асинхронная функция, а SendMessage - синхронная функция.

Теперь вопрос для моего приложения (которое требует высокой производительности), какую функцию лучше использовать?

Обратите внимание, что я использую MFC в Visual Studio 2010 и для этого кода:

CWnd *pParentOfClass = CWnd::GetParent();
pParentOfClass ->  

У меня есть только эти функции для отправки сообщений:

  • PostMessageW

  • Отправить сообщение

  • SendMessageW

Дополнительные вопросы:
Можете ли вы рассказать мне разницу между SendMessage и SendMessageW?


person Sepideh Abadpour    schedule 30.08.2013    source источник
comment
Это зависит от того, какое сообщение (я) вы хотите отправить - не могли бы вы привести несколько примеров?   -  person Edward Clements    schedule 30.08.2013
comment
ну, это требует дополнительных объяснений. Скоро отредактирую свой вопрос. см. отредактированный раздел. спасибо @EdwardClements   -  person Sepideh Abadpour    schedule 30.08.2013
comment
Пожалуйста, не задавайте два вопроса в одном посте.   -  person Jabberwocky    schedule 30.08.2013
comment
Я проголосовал за этот вопрос, потому что в нем есть вся необходимая информация об этих двух API.   -  person Broken_Window    schedule 30.05.2014


Ответы (1)


Фактически вы уже ответили на свой вопрос, описав SendMessage и PostMessage.

SendMessage: отправляет сообщение и ждет, пока процедура, ответственная за сообщение, не завершится и не вернется.

PostMessage: отправляет сообщение в очередь сообщений и немедленно возвращается. Но вы не знаете, когда это сообщение действительно обрабатывается. Следовательно, если вы должны ожидать ответа от этого обработанного сообщения, вы, скорее всего, также получите его через сообщение.

Это действительно зависит от того, какой из них использовать, но конечные результаты практически одинаковы, дело только в сроках. Кроме того, PostMessage особенно полезен в многопоточных приложениях, что позволяет безопасно обмениваться данными между потоками через созданные ими окна.

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

person bcause    schedule 30.08.2013
comment
вы можете объяснить эту часть подробнее? Макросы без окончания A или W являются макросами препроцессора и будут делегировать все, на что настроено ваше приложение. - person Sepideh Abadpour; 30.08.2013
comment
Не должно быть слишком важным, просто используйте общие (то есть без особых окончаний). См. ANSI / Unicode в WinAPI для получения дополнительной информации. - person bcause; 30.08.2013
comment
Infact @no_seriously, я понял из вашего ответа, что если я ожидаю, что обработчик вернет значение и выполнит мой процесс на основе этого значения, я должен использовать SendMessage, но главный вопрос заключается в том, какой из них имеет лучшую производительность. В части вашего ответа говорится, что дело просто в сроках. Не могли бы вы объяснить это немного подробнее? - person Sepideh Abadpour; 30.08.2013
comment
Что ж, говоря очень строго, я бы сказал, что SendMessage быстрее, поскольку ему не нужно проходить через очередь сообщений и сразу же обрабатывается. PostMessage откладывает обработку до тех пор, пока не будут обработаны сообщения, которые находились в очереди перед отправкой сообщения. Чтобы сделать его простым и приятным, SendMessage работает быстрее. Но опять же, это не должно быть главной проблемой, когда речь идет о высокой производительности, все зависит от того, что именно вы хотите заархивировать. - person bcause; 30.08.2013
comment
@sepideh Если вы спрашиваете о сравнении производительности двух вызовов API, выполняющих разные действия, вы делаете это неправильно. - person IInspectable; 30.08.2013