【问题标题】:boost::asio::deadline_timer with std::chrono time valuesboost::asio::deadline_timer 与 std::chrono 时间值
【发布时间】:2013-05-24 03:11:51
【问题描述】:

我有一个使用 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: 错误:无效使用不完整类型'boost::asio::deadline_timer_service >>, boost::asio::time_traits >> >::traits_type {aka struct boost::asio::time_traits > > >}'

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

【问题讨论】:

    标签: c++ boost-asio


    【解决方案1】:

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

    对于早期版本,您将不得不传递一个特征结构来处理转换为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 
    

    【讨论】:

    • 感谢您的详细回答,戴夫。 basic_waitable_timer 对我来说很好用,因为我使用的是 1.53。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多