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

How to use boost asio steady timer expiry to get the execute timepoint

我想获取 boost asio 稳定计时器触发的时间点。 文档说“expiry 获取计时器的到期时间作为绝对时间”。 我不明白什么是绝对时间。我不明白过期的结果。演示:(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 稳定计时器获取计时器触发的时间?

问题是您将苹果与橙子进行比较。 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 秒。

My question is how to get the time when the timer fires with boost asio steady timer?

你可以通过获取expiry()和当前时间之间的差值来获取计时器的剩余时间,这只是-运算符,只要两个时间点是相对于相同的纪元:

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