如何使用boost asio stable timer expiry获取执行时间点

Posted

技术标签:

【中文标题】如何使用boost asio stable timer expiry获取执行时间点【英文标题】:How to use boost asio steady timer expiry to get the execute timepoint 【发布时间】:2021-07-19 20:30:30 【问题描述】:

我想获取 boost asio 稳定计时器触发的时间点。 文档说“到期获取计时器的到期时间作为绝对时间”。 我不明白什么是绝对时间。我不明白过期的结果。演示:(on wandbox)

#include <boost/asio.hpp>
#include <chrono>
#include <iostream>

int
main ()

  using namespace boost::asio;
  io_service io;
  auto timer = steady_timer (io);
  using namespace std::chrono_literals;
  using namespace std::chrono;
  std::cout << "before timer set" << std::endl;
  std::cout << duration_cast<seconds> (timer.expiry ().time_since_epoch ()).count () << " seconds" << std::endl;
  timer.expires_after (10s);
  std::cout << "after timer set" << std::endl;
  std::cout << duration_cast<seconds> (timer.expiry ().time_since_epoch ()).count () << " seconds" << std::endl;
  std::cout << "current time using system_clock::now ()" << std::endl;
  std::cout << duration_cast<seconds> (system_clock::now ().time_since_epoch ()).count () << " seconds" << std::endl;
  return 0;

结果:

before timer set
0 seconds
after timer set
21652309 seconds
current time using system_clock::now ()
1626725470 seconds

我的问题是如何通过 boost asio 稳定计时器获得计时器触发的时间?

【问题讨论】:

【参考方案1】:

问题在于您将苹果与橙子进行比较。 system_clocksteady_clock 不共享同一个时代。换句话说,它们代表来自不同参考点的时间。

您必须通过time_since_epoch() 才能比较它们这一事实是一个重要指标,表明您真的不应该首先比较它们。

如果您将上次打印输出替换为使用steady_clock::now(),则输出变为:

before timer set
0 seconds
after timer set
21656958 seconds
current time using system_clock::now ()
21656948 seconds

预计相差 10 秒。

我的问题是如何通过 boost asio 稳定计时器获得计时器触发的时间?

您可以通过获取expiry() 与当前时间之间的差值来获取计时器上的剩余时间,只要两个时间点都相对于同一时期,这就是- 运算符:

cout << duration_cast<seconds>(timer.expiry() - steady_clock::now()).count() << " seconds" << std::endl;

【讨论】:

我会把它写成(timer.expiry() - steady_clock::now()) / 1.0s(或者1s表示整数除法)。不过,这些都不是绝对时间戳 如果你想将时间点从一个系统发送到另一个系统,你可以使用 boost::asio::system_timer 而不是 boost::asio::steady_timer 因为 boost::asio::steady_timer 不是基于固定时间点,例如 boost::asio::system_timer(1970 年 1 月 1 日 UTC 时间 00:00:00)

以上是关于如何使用boost asio stable timer expiry获取执行时间点的主要内容,如果未能解决你的问题,请参考以下文章

获取Boost deadline_timer原生文件描述符

如何使用 Boost::Asio 访问 Web 服务?

C++ Boost ASIO:如何读取/写入超时?

如何使用 boost::asio::serial_port 支持硬件流控制?

编译 sio 客户端时出错

如何在 Qt 中使用 boost::asio::deadline_timer?