c++ - ASIO io_service 在第二次 run() 调用时不处理后处理程序
问题描述
我希望能够将一组处理程序发布到boost::asio::io_service
然后运行所有处理程序。当所有处理程序完成后,我想再次添加一组新的处理程序run()
。并在一个线程中永远重复这一点。
但是我有一个问题,在第一次run()
通话后,下一个发布的工作被忽略了。
这是一个小例子(coliru):
#include <iostream>
#include <boost/asio.hpp>
int main()
{
boost::asio::io_service io;
io.post([]{ std::cout << "Hello";});
io.run();
io.post([]{ std::cout << ", World!" << std::endl; });
io.run();
}
它只会打印“ Hello ”消息,然后成功退出。
为什么这个例子不打印“Hello, World!”?
增强版:1.71.0
解决方案
您必须调用restart:
run() 函数的正常退出意味着 io_context 对象已停止(stopped() 函数返回 true)。对 run()、run_one()、poll() 或 poll_one() 的后续调用将立即返回,除非之前调用了 restart()。
io.post([]{ std::cout << "Hello";});
io.run();
io.post([]{ std::cout << ", World!" << std::endl; });
io.restart(); // just here
io.run();
推荐阅读
- haskell - 我可以对浮点负数进行增强吗?- 哈斯克尔
- javascript - 从另一台没有工匠的电脑上运行 laravel 服务 css 和 js 不工作
- android - 在 stop() 和 prepareAsync() 之后未调用 MediaPlayer onPrepared() 的问题
- google-api - Drive Activity 功能在版本 v3 中不再可用
- android - Gaxios._request 中的值无效 (/srv/node_modules/googleapis-common/node_modules/gaxios/build/src/gaxios.js:89:23)
- python - 在 Spotify 上获取当前播放的歌曲
- css - pdf由带有pandoc的markdown制成,在一段时间后消除了双倍空格
- c# - 是否可以在 Timer 被处理后生成触发 System.Timers.Timer 的 Elapsed 事件的示例?
- c++ - 如何创建 += 运算符
- html - 将文本与响应式图像的特定基线对齐