- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题的灵感来自 boost asio 文档 (link) 中关于异步定时器的教程。代码略作修改,效果更明显。
有一个相关的问题,Multiple async_wait from a boost Asio deadline_timer .但我不确定该问题的答案是否适用于我的情况。
如果重复的行被注释掉,代码非常简单并且可以按预期工作,如下所示。
持续时间为 1s
的 steady_timer
调用 async_wait
。
当它过期时,调用处理程序。在处理程序内部,定时器的生命周期再延长一秒,定时器再次调用 async_wait
。
变量 count
为 20 用于限制计时器可以触发的次数。
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>
namespace asio = boost::asio;
void bind_handler(const boost::system::error_code& ec,
asio::steady_timer& t,
int count) {
if (count > 0) {
std::cout << "getting " << count << "\n";
t.expires_at(t.expiry() + std::chrono::seconds(1));
t.async_wait(boost::bind(bind_handler, asio::placeholders::error,
boost::ref(t), --count));
}
}
int main() {
asio::io_context io_context(1);
asio::steady_timer t(io_context, std::chrono::seconds(1));
int count = 20;
t.async_wait(boost::bind(bind_handler, asio::placeholders::error,
boost::ref(t), count));
//t.async_wait(boost::bind(bind_handler, asio::placeholders::error,
// boost::ref(t), count));
auto start = std::chrono::steady_clock::now();
io_context.run();
auto end = std::chrono::steady_clock::now();
std::cout
<< std::chrono::duration_cast<std::chrono::seconds>(end - start).count()
<< " seconds passed\n";
return 0;
}
此代码的输出如下所示。每过一秒就会打印一行。
getting 20
getting 19
getting 18
...lines...
...omitted...
getting 3
getting 2
getting 1
21 seconds passed
但是,如果上面代码中的两行没有注释,程序的行为就会大不相同。输出粘贴在下面。该程序在一秒内打印从 getting 20
到 getting 1
的所有行,40 秒内什么都不显示,然后打印最后一行。
getting 20
getting 20
getting 19
getting 19
getting 18
getting 18
...lines...
...omitted...
getting 3
getting 3
getting 2
getting 2
getting 1
getting 1
41 seconds passed
我的问题是,async_wait
的多次递归调用如何影响程序的行为?我觉得正在进行某种数据竞赛,但数字仍然按顺序打印。此外,只涉及一个线程,正如我们在 io_context
构造函数中看到的那样。
最佳答案
似乎该行为的答案在于 basic_waitable_timer::expires_at(const time_point & expiry_time)
的文档中:
This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the boost::asio::error::operation_aborted error code.
在您的示例中,当第一个计时器完成时,它会调用 expires_at
以便将计时器转发一秒钟。然而,这会取消第二次运行的 await 调用,现在将在下一次事件循环迭代中直接调用,并出现 operation_aborted
错误。但是,由于您不检查错误代码 ec
,因此看不到它。现在这个handler会直接再次转发定时器,从而取消上一次启动的async_wait
。
这会继续下去,直到处理程序经常取消自己,以至于 count==0
并且只有一个计时器在运行。由于到期日期每次转发 1 秒,代码仍然等待整整 40 秒过去。
关于c++ - boost asio steady_timer 上的多个递归 async_wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54241257/
我正在浏览 boost::asio 示例。我在看 Example 4 令人困惑的是,这个例子中的 WaitHandler 有签名 void print (this) 但是 async_wait 调用需
我有一些 lua 脚本有一些长时间运行的任务,比如获取网页,所以我让它 yield 然后 C 代码句柄获取页面作业异步,所以线程可以自由地做其他工作,并在指定时间后返回检查查看获取页面作业是否已完成,
我们有一个方法需要经常调用来做一些计算(大约每秒 20 次)。这是一个同步调用。调用者需要尽快得到结果。但该计算过程有时花费的时间比预期的要长。我们不想改变其他任何东西。我们只是想添加一种监控机制来标
这很好用: class cStartSequence { void Tick() { // do something } void Wait() { myTimer->expires_f
在打开的套接字上时,我调用async_read()/read(),对等方随后关闭套接字-我将在处理程序中收到eof错误,但是对于async_wait()/wait()不会发生,该处理程序调用时没有错误
我正在创建一个程序,并且我正在尽可能地异步执行。 我需要运行一个程序,当这个程序完成时它调用一个回调函数。我找到了一个版本的 boost::process 并决定使用,但似乎有示例但在我下载的源代码中
我正在学习 Boost.Asio,但我对 boost::asio::deadline_timer async_wai 有疑问。这是来自 boost 主页的代码: // // timer.cpp //
在我的应用程序中,我发送和接收大量消息并充当服务器。与此同时,我检查客户端的 session 超时。当我在我的应用程序中不使用 async_wait 时,我的程序运行良好。但是当我使用 async_w
我执行一个简单的例子作为测试,我想在 5 秒后执行一个简单的操作。我正在使用带有 async_wait 的 boost::deadline_timer,但是 async_wait 不是异步等待...这
我正在学习 boost asio 文档。我遇到了这个 deadline_timer 示例。 #include #include #include #include /*This timer e
boost asio deadline_timer async_wait 函数采用以下形式的处理程序: void handler(const boost::system::error_code& er
当我在方法 SendMessageAgain 中调用 deadline_timer::async_wait 时,偶尔会抛出段错误。它可以通过以下两种方式之一发生;我在下面包含了回溯。它似乎是随机的,这
这个问题在这里已经有了答案: How to use boost bind with a member function (3 个答案) 关闭 7 年前。 在这个类中使用 boost 异步定时器的例子
这个问题的灵感来自 boost asio 文档 (link) 中关于异步定时器的教程。代码略作修改,效果更明显。 有一个相关的问题,Multiple async_wait from a boost A
为什么将 lambda 传递给 asyn_wait() 需要 auto ... 参数,而传递函数不需要这样的东西(即只需要函数名就可以),如 timer.async_wait( &print ); i
我已经实现了一个优先级从asio examples开始的任务队列和一个使用这个队列的定时器类。这是代码: priority_task_queue.h class handler_priority_qu
我得到了 boost io_service在一个线程中运行,我想在客户端发生某个事件后 6 秒在该线程中触发回调,如果该客户端已经在运行,则重置该客户端的计时器。 我维护一个 unordered_ma
我目前正在尝试使用 Boost::Asio 创建一个服务器应用程序,它可以做两件简单的事情: 接受客户的传入连接 一旦客户端被接受,启动一个boost::asio::deadline_timer,它会
我想转这个电话: timer.async_wait(handler); 进入这个电话: func(handler); 所以我尝试使用 std::bind: #include #include #i
是否可以在同一个 boost::asio::deadline_timer 上多次调用 async_wait? 我的意思是像下面这样: t->expires_from_now(delay); t->as
我是一名优秀的程序员,十分优秀!