Почему peekmessage перед getmessage? - PullRequest
9 голосов
/ 17 мая 2010

Почему оператор peekMessage требуется перед Getmessage () для создания очереди сообщений?

Ответы [ 3 ]

21 голосов
/ 17 мая 2010

Не требуется.

Однако иногда вы видите поток, который еще не готов обрабатывать сообщения, но хочет иметь возможность получать их в своей очереди сообщений. Новые потоки не имеют очередей сообщений сразу, но для создания очереди сообщений достаточно вызова PeekMessage. Он немедленно возвращается, поскольку сообщения нет, и это позволяет потоку продолжать готовиться. Тем временем другие потоки могут начать помещать в очередь сообщения для нового потока. Когда новый поток готов, он вызывает GetMessage, чтобы либо получить первое сообщение из очереди, либо дождаться, когда сообщение будет помещено в очередь.

14 голосов
/ 17 мая 2010

Это не так. Эти две функции делают разные вещи.

PeekMessage (...) не ждет появления сообщения - оно получает первое, если оно есть, при желании также удаляет его из очереди, но сразу возвращает false, если его нет Это чаще встречается в приложениях, где вы выполняете некоторую обработку, ожидая сообщений, и не можете просто сидеть и ждать следующего сообщения вечно. Игры в реальном времени и тому подобное легко попадают в эту категорию.

GetMessage (...) ждет, пока есть сообщение, и получает его. Это более эффективно CPUwise, потому что он не постоянно опрашивает, но остановится, если нет никаких сообщений. Это чаще встречается в больших приложениях и других программах, которые не требуют постоянной обработки в реальном времени.

1 голос
/ 27 мая 2010

Существует несколько причин для использования PeekMessage перед / вместо GetMessage:

  1. Обеспечение того, что программа не будет зависать, пока не прибудет сообщение - это немного избыточно, потому что вы можете напрямую использовать PeekMessage с флагом PM_REMOVE для опроса очереди сообщений и полного исключения GetMessage.
  2. Использование функции с PM_NOREMOVE и принятие решения, хотите ли вы обработать и / или удалить сообщение из очереди, или нет.
  3. Вызов IsWindowUnicode в дескрипторе окна возвращаемых сообщений и выбор PeekMessageA или PeekMessageW.
  4. Несколько из вышеперечисленного.
...