9

为什么在 Getmessage() 之前需要 peekMessage 语句来创建消息队列?

4

3 回答 3

21

这不是必需的。

但是,您有时会看到一个尚未准备好处理消息的线程,但它希望能够在其消息队列中接收它们。新线程不会立即拥有消息队列,但调用PeekMessage足以创建消息队列。由于没有消息,它立即返回,这允许线程继续准备好自己。同时,其他线程可以开始为新线程排队消息。一旦新线程准备就绪,它就会调用GetMessage以从队列中检索第一条消息,或者等待将消息放入队列。

于 2010-05-17T15:20:19.670 回答
16

它不是。这两个函数做不同的事情。

PeekMessage(...) 不会等待消息出现——如果有消息,它会获取第一个消息,也可选择将其从队列中删除,但如果没有消息则立即返回 false。在您在等待消息时进行一些处理并且不能只是坐在那里永远等待下一条消息的应用程序中,这种情况更为常见。实时游戏等很容易就属于这一类。

GetMessage(...) 等待直到有消息,并得到它。它在 CPU 方面效率更高,因为它不会不断轮询,但如果没有任何消息,它将暂停。它在不需要持续实时处理的应用程序和其他程序中更为常见。

于 2010-05-17T15:20:49.263 回答
1

PeekMessage使用before/代替有多种原因GetMessage

  1. 确保程序在消息到达之前不会挂起 - 这有点多余,因为您可以直接使用PeekMessage标志PM_REMOVE来轮询消息队列并GetMessage完全省略。
  2. 使用该函数PM_NOREMOVE并决定是否要处理和/或从队列中删除消息。
  3. 调用IsWindowUnicode返回消息的窗口句柄并选择PeekMessageAPeekMessageW
  4. 上述的多个。
于 2010-05-27T15:49:04.507 回答