是否可以按FIFO顺序将自定义消息放入win32消息队列中?

时间:2018-11-18 18:17:16

标签: winapi

我可以通过几种方法为GUI线程发送消息。

PostMessage :根据文档,这些消息首先被处理(在大多数其他消息之前)。如果我经常使用它,GUI线程可能只会处理我的消息,而不会处理其他任何消息(不会响应键盘,鼠标等)。这是太高优先级的方法。

SetTimer :WM_TIMER消息在所有其他操作之后最后处理,因此,如果发生任何绘画(例如,如果我连续移动窗口),所有时间都将花费在处理常见消息上,并且WM_TIMER将触发太晚了。 这种方法的优先级太低。

我需要介于两者之间的内容来尽快处理我的自定义消息,但仍然为其余消息留出空间以保持GUI的响应速度。

我想尝试的是将一些消息以与普通消息相同的顺序进行处理。 所以这是问题,我该怎么办?


添加:

我有一个准备视频帧的线程,它需要通知主(UI)线程新帧已准备好并可能显示它。在典型的游戏循环中,类似

  • 处理消息,直到队列为空
  • 处理1帧
  • 重复

但是现在我无法控制消息循环,因为它可能位于模式弹出窗口或菜单中。

1 个答案:

答案 0 :(得分:0)

假定答案为“否”(没有其他插入消息的方式)。 但是,在处理发布的消息时,我可以监视经过的时间,并立即通过WM_TIMER发出同一消息,而不是对其进行处理。

更新

经过一些观察,似乎没有给定的时间(1 ms?5 ms?)可以保证将处理输入。相反,有效的方法是显式检查输入消息的消息队列:

case MY_MSG:
{
    MSG msg;
    if(PeekMessage(&msg,0,0,0,PM_NOREMOVE|PM_QS_INPUT))
        SetTimer(hwnd,MY_TIMER,0,0);
    else
        DoWork();
}
return 0;