gpt4 book ai didi

c++ - WinAPI 的::WaitMessage 阻止 WM_TIMER 到来

转载 作者:太空宇宙 更新时间:2023-11-04 15:50:00 27 4
gpt4 key购买 nike

我遇到过 WinAPI 的奇怪行为,在我看来是这样。在我的程序中,我为窗口设置了一个计时器

::SetTimer(window_handle, timer_id, 10, NULL);

并在我的窗口过程中处理 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();
}

希望有人能帮我解决这个问题。

最佳答案

是的,这将随机无法处理更多的计时器消息。 WaitMessage() 的一个非常严格的规则是消息队列在您调用它之前应该是空的。如果它不为空,则留在队列中的任何消息都被标记为“已读”并且 WaitMessage() 会忽略它们。

因此,失败场景是队列中有两条 消息,比如一条鼠标消息和一条计时器消息。您收到鼠标消息但留下计时器消息。由于您尚未处理未决的消息,因此不会生成其他计时器消息。 GetMessage + WaitMessage 的组合很麻烦,你必须使用 PeekMessage 代替。

只需删除 WaitMessage(),它在这里没有任何用处。

关于c++ - WinAPI 的::WaitMessage 阻止 WM_TIMER 到来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10138812/

27 4 0
文章推荐: html - Angular 6 NgClass 更改标签中的 css 类
文章推荐: javascript - 如何将