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 函数。我喜欢MsgWaitForMultipleObjectsEx 版本。它们让我可以在单个线程上管理几乎任何一组任务,而无需担心竞争条件。

以上是关于Boost.Asio Win32 Windows 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 Boost.Asio 和 OpenSSL 的 HTTPS 请求

Boost asio async_accept 在 Windows 下工作,但在 FreeBSD 下失败。怎么了?

错误:C1083:无法打开包含文件:'boost/asio.hpp':没有这样的文件或目录

在 Windows 上使用 Boost.Asio 的半并发 ICMP ping

CMake 中的平台检测

优雅地终止基于 Boost Asio 的 Windows 控制台应用程序