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