Почему peekMessage оператор требуется перед Getmessage () для создания очереди сообщений?
Не требуется.
Иногда вы видите поток, который еще не готов обрабатывать сообщения, но хочет иметь возможность получать их в своей очереди сообщений. Новые потоки не сразу имеют очереди сообщений, но вызова PeekMessage
достаточно для создания очереди сообщений. Он возвращается немедленно, поскольку сообщения нет, и это позволяет потоку продолжить подготовку. Тем временем другие потоки могут начать ставить сообщения в очередь для нового потока. Когда новый поток готов, он вызывает GetMessage
, чтобы либо получить первое сообщение из очереди, либо дождаться помещения сообщения в очередь.
Это не так. Эти две функции делают разные вещи.
PeekMessage (...) не дожидается появления сообщения - он получает первое сообщение, если оно есть, при желании также удаляя его из очереди, но возвращает false сразу же, когда его нет. Это чаще встречается в приложениях, где вы выполняете некоторую обработку, ожидая сообщения, и не можете просто сидеть и ждать следующего сообщения вечно. Игры в реальном времени и тому подобное легко попадают в эту категорию.
GetMessage (...) ждет сообщения и получает его. Это более эффективно с точки зрения ЦП, потому что он не опрашивает постоянно, но он будет приостанавливать работу, если нет никаких сообщений. Это чаще встречается в форматных приложениях и других программах, которые не требуют постоянной обработки в реальном времени.
Есть несколько причин для использования PeekMessage
перед / вместо GetMessage
:
PeekMessage
с флагом PM_REMOVE
, чтобы опросить очередь сообщений и полностью исключить GetMessage
. PM_NOREMOVE
и решение, хотите ли вы обработать и / или удалить сообщение из очереди или нет. IsWindowUnicode
для дескриптора окна возвращенных сообщений и выбор либо PeekMessageA
, либо PeekMessageW
.