为什么在getmessage之前偷看消息?

时间:2010-05-17 15:06:27

标签: delphi winapi peekmessage getmessage idle-processing

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

3 个答案:

答案 0 :(得分:21)

这不是必需的。

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

答案 1 :(得分:14)

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

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

GetMessage(...)等待直到有消息,然后获取它。它的CPUwise效率更高,因为它不会经常轮询,但如果没有任何消息,它会暂停。它在formy应用程序和其他程序中更常见,不需要进行持续的实时处理。

答案 2 :(得分:1)

使用PeekMessage之前/代替GetMessage有多种原因:

  1. 确保程序在消息到达之前不会挂起 - 这有点多余,因为您可以直接使用带有PeekMessage标志的PM_REMOVE来轮询消息队列并省略GetMessage共。
  2. 将函数与PM_NOREMOVE一起使用,并决定是否要处理和/或删除队列中的消息。
  3. 在返回的消息窗口句柄上调用IsWindowUnicode,然后选择PeekMessageAPeekMessageW
  4. 以上的多项内容。