【问题标题】:Why peekmessage before getmessage?为什么在 getmessage 之前 peekmessage?
【发布时间】:2011-02-20 11:12:36
【问题描述】:

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

【问题讨论】:

    标签: delphi winapi peekmessage getmessage idle-processing


    【解决方案1】:

    这不是必需的。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      【解决方案3】:

      GetMessage 之前/而不是GetMessage 之前使用PeekMessage 有多种原因:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多