可以在以下位置阅读:
https://svn.boost.org/trac/boost/ticket/3504 https://svn.boost.org/trac/boost/ticket/3504
一个定期超时的deadline_timer,它是使用deadline_timer::expires_at() 实现的(就像中的示例)升压定时器教程,第三个示例 http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/tutorial/tuttimer3/src.html如果修改系统时间(例如,如果您的操作系统是 Linux,则使用 date 命令),则可能会失败。
现在是否有一种简单且合适的方法来使用 Boost 来执行此操作?我不想使用 Deadline_timer::expires_from_now() 因为我可以验证它不如“手动”更新到期时间准确。
作为临时解决方案,我决定在设置新的 expires_at 值之前,计算 now() 和 expires_at() 之间的时间段。如果它是周期性延迟的两倍以上,那么我会例外地使用 expires_from_now() 与新的绝对时间重新同步。
在 Boost 1.49+ 中,Boost.Asio http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/history.html提供steady_timer http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/steady_timer.html。该定时器使用chrono::steady_clock http://www.boost.org/doc/libs/1_53_0/doc/html/chrono/users_guide.html#chrono.users_guide.tutorial.clocks,一个不受系统时钟变化影响的单调时钟。
如果您无法使用 Boost 1.49+,那么检查计时器或时钟是否发生变化是一个合理的替代解决方案。虽然这是一个实现细节,但 Boost.Asio 可能会限制在其反应器中等待事件所花费的时间,以便它可以定期检测系统时间的变化。例如,反应堆实现使用epoll
最多等待 5 分钟。因此,如果不强制 Reactor 中断(例如在计时器上设置新的过期时间),Boost.Asio 最多可能需要 5 分钟才能检测到系统时间的更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)