Cyi*_*nor 0 c++ winapi timer window-messages
我遇到了一个,所以在我看来,WinAPI的奇怪行为.在我的程序中,我正在为窗口设置计时器
::SetTimer(window_handle, timer_id, 10, NULL);
Run Code Online (Sandbox Code Playgroud)
并在我的窗口过程中处理WM_TIMER消息.为了减少所需的CPU时间,我也在::WaitMessage消息泵中使用该功能.事实证明,只要我有::WaitMessage那里的功能,WM_TIMER消息就会在一段时间后停止.如果我从我的消息泵中删除它,一切正常,如预期的那样.
现在我想知道我设置我的计时器错误或者这是否是标准行为::WaitMessage.搜索MSDN和网络并没有让我知道为什么会这样.
这是我使用的消息泵:
while(true) {
if(GetMessage(&msg, _window_handle, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} else {
return 0;
}
WaitMessage();
}
Run Code Online (Sandbox Code Playgroud)
希望有人可以为我清除这一点.
是的,这将随机处理更多计时器消息.WaitMessage()的一个非常难的规则是在调用之前消息队列应该为空.如果它不为空,则队列中剩余的任何消息都标记为"已见",WaitMessage()将忽略它们.
因此,故障情况是队列中有两条消息,比如鼠标消息和计时器消息.您收到鼠标消息但保留计时器消息.由于您尚未处理待处理的消息,因此不会生成其他计时器消息.GetMessage + WaitMessage的组合非常麻烦,您必须使用PeekMessage.
只需删除WaitMessage(),它就没有用处.