Почему peekmessage прежде getmessage?

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

9
задан HostileFork 8 June 2010 в 23:20
поделиться

3 ответа

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

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

21
ответ дан 4 December 2019 в 06:35
поделиться

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

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

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

14
ответ дан 4 December 2019 в 06:35
поделиться

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

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

Похожие вопросы: