Boost.Asio Win32 Windows 应用程序
Posted
技术标签:
【中文标题】Boost.Asio Win32 Windows 应用程序【英文标题】:Boost.Asio Win32 Windows application 【发布时间】:2014-02-09 03:20:15 【问题描述】:我使用 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 线程而不是 boost?
【问题讨论】:
也许可以试试PeekMessage
?
你也可以试试io_service.poll()
而不是io_service.poll_one()
@kenba io_service.poll()
和 io_service.poll_one()
在我的项目中是等效的,因为只有一个处理程序。
【参考方案1】:
它不像 Boost 那样可移植,但 Windows 已经提供了与消息循环集成的不错的事件 API。
您可以使用CreateWaitableTimer
并将GetMessage
替换为MsgWaitForMultipleObjects
。然后循环将唤醒传入消息或计时器。也可以使用其他类型的手柄。
当然,总是有SetTimer
会导致您收到WM_TIMER
消息。但我更喜欢等待计时器。
【讨论】:
CreateWaitableTimer
实际上是一个不错的选择,因为项目不一定是可移植的。谢谢!
@Hiale: 是的,如果您的代码中已经包含GetMessage
,那么它与 Win32 API 紧密耦合,您不必害怕使用其他 Windows 函数。我喜欢MsgWaitForMultipleObjects
和Ex
版本。它们让我可以在单个线程上管理几乎任何一组任务,而无需担心竞争条件。以上是关于Boost.Asio Win32 Windows 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 Boost.Asio 和 OpenSSL 的 HTTPS 请求
Boost asio async_accept 在 Windows 下工作,但在 FreeBSD 下失败。怎么了?
错误:C1083:无法打开包含文件:'boost/asio.hpp':没有这样的文件或目录