Boost::asio::deadline_timer与std::chrono时间值

boost::asio::deadline_timer with std::chrono time values

本文关键字:std chrono 时间 timer asio deadline Boost      更新时间:2023-10-16

我有一个使用asio截止日期计时器的应用程序。应用程序的其余部分使用std::chrono结构作为其时间值,而仅对接触asio的内容使用boost::posix_time会让人感到尴尬。如果可以的话,我想在整个应用程序中使用std::chrono,以保持一致性,可读性等。

在我看来,答案将涉及使用定时器的模板:

typedef boost::asio::basic_deadline_timer<std::chrono::system_clock::time_point>
    my_deadline_timer_type;
 my_deadline_timer_type a_timer(io_service); 

除了这在编译时严重爆炸…许多行错误,其中大多数类似于:

/opt/arm/include/boost/asio/deadline_timer_service.hpp:51:43: error: invalid use of incomplete type 'boost::asio::deadline_timer_service>>, boost::asio::time_traits>>>>::traits_type {aka struct boost::asio::time_traits>>>}'

所以,看起来我可能需要创建一个新的traits_type并使用它声明一个deadline_timer_service,但我不确定如何/在哪里。我必须相信这个问题已经解决了。我在linux上使用g++ 4.7.3 + -std=c++11,交叉编译到arm.

如果您使用的是boost 1.49或更高版本,ASIO引入了basic_waitable_timer,它使用来自std::chronoboost::chrono的c++ 11兼容时钟。它们还为steady_clocksystem_clockhigh_resolution_clock的boost版本提供了预定义的类型。它的功能与deadline_timer相同,但使用c++ 11时钟机制而不是boost::posix_time结构。

对于早期版本,您将不得不传递一个trait结构来处理到deadline_timer所期望的类型的转换。请参阅ASIO TimeTraits要求。大多数是微不足道的,最后一个不是。例如

template<typename Clock>
struct CXX11Traits
{
  typedef typename Clock::time_point time_type;
  typedef typename Clock::duration   duration_type;
  static time_type now()
  {
      return Clock::now();
  }
  static time_type add(time_type t, duration_type d)
  {
      return t + d;
  }
  static duration subtract(time_type t1, time_type t2)
  {
      return t1-t2;
  }
  static bool less_than(time_type t1, time_type t2)
  {
      return t1 < t2;
  }
  static  boost::posix_time::time_duration 
  to_posix_duration(duration_type d1)
  {
    using std::chrono::duration_cast;
    auto in_sec = duration_cast<std::chrono::seconds>(d1);
    auto in_usec = duration_cast<std::chrono::microseconds>(d1 - in_sec);
    boost::posix_time::time_duration result =
      boost::posix_time::seconds(in_sec.count()) + 
      boost::posix_time::microseconds(in_usec.count());
    return result;
  }
};

然后,您将为想要使用的每个c++ 11时钟创建截止日期计时器。这里的例子是std::system_clock。您可以正常使用此截止日期计时器。

typedef boost::asio::basic_deadline_timer< 
        std::system_clock,  
        CXX11Traits<std::system_clock>> my_system_clock_deadline_timer