我可以通过几种方法为GUI线程发送消息。
PostMessage :根据文档,这些消息首先被处理(在大多数其他消息之前)。如果我经常使用它,GUI线程可能只会处理我的消息,而不会处理其他任何消息(不会响应键盘,鼠标等)。这是太高优先级的方法。
SetTimer :WM_TIMER消息在所有其他操作之后最后处理,因此,如果发生任何绘画(例如,如果我连续移动窗口),所有时间都将花费在处理常见消息上,并且WM_TIMER将触发太晚了。 这种方法的优先级太低。
我需要介于两者之间的内容来尽快处理我的自定义消息,但仍然为其余消息留出空间以保持GUI的响应速度。
我想尝试的是将一些消息以与普通消息相同的顺序进行处理。 所以这是问题,我该怎么办?
添加:
我有一个准备视频帧的线程,它需要通知主(UI)线程新帧已准备好并可能显示它。在典型的游戏循环中,类似
但是现在我无法控制消息循环,因为它可能位于模式弹出窗口或菜单中。
答案 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;