我使用Visual Studio向导创建了一个新的Win32 Windows应用程序。并将Boost.Asio添加到项目中。我想用deadline_timer每秒做一些重复的工作。虽然计时器(及其线程)运行良好,但我鼓励UI没有更新的问题,因为io_service.run()阻止了UI线程。快速搜索后,我找到了this thread。这实际上是同样的问题!所以,我在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线程而不是提升?
答案 0 :(得分:0)
它不像Boost那样可移植,但是Windows已经提供了与消息循环集成的漂亮的事件API。
您可以使用CreateWaitableTimer
并将GetMessage
替换为MsgWaitForMultipleObjects
。然后循环将唤醒传入消息或计时器。也可以使用其他类型的手柄。
当然,始终SetTimer
会导致您收到WM_TIMER
消息。但我更喜欢等待计时器。