2

Чем отличаются функции SendMessage и PostMessage?

Regent
  • 19,134
delphikettle
  • 1,330
  • 4
  • 24
  • 50

3 Answers3

11

(Уточнение-комментарий к ответу @Asen)

  • И PostMessage, и SendMessage, если пользоваться вашей терминологией, "шлют сообщение сразу", поскольку единственное, куда можно отослать сообщения (за исключением Nonqueued messages) - это в некоторую внутреннюю очередь.

  • Это реализовано так, поскольку в противном случае решение race conditions типа "50 потоков одновременно послали сделали SendMessage" стало бы очень проблематичным.

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

  • Последний факт, кстати говоря, заметен из их сигнатур:

    BOOL WINAPI PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    
    LRESULT WINAPI SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    
M. Williams
  • 23,562
4

PostMessage - Ставит сообщение в очередь, и код выполняется дальше.

SendMessage - Функция SendMessage шлет сообщение сразу

AseN
  • 13,629
4

SendMessage - синхронная, PostMessage - асинхронная.

AlexAndR
  • 654