- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到过 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/
#include #include class tWnd { private: static LRESULT CALLBACK Disp_test_WndProc( HWN
好吧,我正在使用一个 50 毫秒消逝时间的计时器来制作一些移动文本的动画(从技术上讲,它在文本之间滚动)。 问题是,如果你仔细观察,你会看到文字在闪烁,我希望它不要闪烁.. 所以我不太擅长动画,但是我
我想在标题中显示我的小游戏节目 FPS,但它不应该为每一帧和单个帧重新计算 FPS。我只想每秒刷新一次 FPS 计数器,所以我尝试使用 SetTimer。问题是计时器只在我不移动鼠标或不按住键时才工作
我正在 Visual Studio Express 2013 中编写一个相当简单的 Windows C++ 应用程序,并且在启动时遇到一个问题,即窗口由于 DispatchMessage 处理 WM_
创建窗口后,我启动了一个计时器来做某事。代码如下: SetTimer(hWnd, 1, 40, NULL); //tick each 40 ms. 我追踪到最后一个错误,它是 0。但我无法接收 wm
这里大家都知道,从WinXP到user32.dll出现了MessageBoxTimeout API。 但现在不是使用未记录的 MessageBoxTimeout,而是使用记录的 MessageBox:
在我正在处理的应用程序中,在某些情况下,应用程序运行速度很慢,在这些情况下,我发现我的移动鼠标、计时器/绘画消息没有得到处理。如果我缓慢移动鼠标,我可以无限期地阻止重新绘制窗口! 我发现这是expec
我最初有一个 ActiveX 控件,它注册了一个每隔几秒触发一次的 Windows 计时器(使用 SetTimer())。到目前为止效果很好。现在为了实现全屏模式,我向我的控件添加了一个子窗口,它应该
我遇到过 WinAPI 的奇怪行为,在我看来是这样。在我的程序中,我为窗口设置了一个计时器 ::SetTimer(window_handle, timer_id, 10, NULL); 并在我的窗口过
我正在开发一款客户端需要继续处理 Windows 消息的游戏,否则游戏可能会被利用。为了解决窗口调整大小和拖动事件期间的这个问题,我们有一个每 50 毫秒触发一次的 WM_TIMER 消息,这将重新启
我有一个 MFC Visual C++ 应用程序,它似乎无法在类向导中工作,但是,我有一个 View (CServerView),我想向其添加 WM_TIMER 事件处理程序。 我已经弄清楚如何调用
我是一名优秀的程序员,十分优秀!