我已经使用Visual Studio向导创建了一个新的Win32 Windows应用程序。并将Boost.Asio添加到项目中。我想使用它的duration_timer每秒钟做一些重复的工作。尽管计时器(及其线程)运行良好,但由于io_service.run()阻止了UI线程,所以我鼓励了UI不更新的问题。快速搜索后,我发现了该线程。这实际上是同样的问题!因此,我将代码移到GetMessage()循环中,并将io_service.run()更改为io_service.poll_one()。
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
//Windows main loop stuff
if (io.stopped())
io.reset();
io.poll_one();
}
好吧,它正在工作,但是仅当有Windows消息等待时,这是显而易见的。我还能做另一件事吗?还是应该使用WinAPI线程代替boost?
它不像Boost那样可移植,但是Windows已经提供了与消息循环集成的不错的事件API。
您可以使用CreateWaitableTimer
和替换GetMessage
为MsgWaitForMultipleObjects
。然后,循环将为传入消息或计时器唤醒。也可以使用其他类型的手柄。
当然,总SetTimer
有一些会导致您收到WM_TIMER
消息。但我更喜欢等待计时器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句