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

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

3 ответов


это не требуется.

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


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

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

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


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

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