2013-05-23 28 views
13

Tôi có một ứng dụng sử dụng thời gian hết hạn asio. Phần còn lại của ứng dụng sử dụng các cấu trúc std::chrono cho các giá trị thời gian của nó và cảm thấy khó xử khi sử dụng boost::posix_time chỉ cho những thứ chạm vào asio. Tôi muốn sử dụng std::chrono suốt ứng dụng nếu tôi có thể, nhất quán, dễ đọc, vvboost :: asio :: deadline_timer với std :: giá trị thời gian chrono

Dường như với tôi rằng câu trả lời sẽ liên quan đến việc sử dụng của timer mẫu:

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

Trừ này thổi lên xấu tại thời gian biên dịch ... nhiều dòng lỗi, hầu hết trong số đó là tương tự như sau:

/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 > > >}'

Vì vậy, có vẻ như tôi có thể cần phải tạo ra một mới traits_type và khai báo một deadline_timer_service sử dụng nó, nhưng tôi m không chắc chắn làm thế nào/whe lại. Tôi phải tin rằng vấn đề này đã được giải quyết. Tôi đang sử dụng g ++ 4.7.3 với -std = C++ 11 trên linux, cross-compiling to arm.

Trả lời

24

Nếu bạn đang sử dụng tăng 1,49 trở lên, ASIO đã giới thiệu basic_waitable_timer, sử dụng đồng hồ tương thích C++ 11, hoặc từ std::chrono hoặc boost::chrono. Họ cũng cung cấp các typedef được xác định trước cho các phiên bản tăng cường của steady_clock, system_clockhigh_resolution_clock. Chức năng của nó giống như deadline_timer, nhưng sử dụng cơ chế đồng hồ C++ 11 thay vì cấu trúc boost::posix_time.

Đối với các phiên bản trước, bạn sẽ phải chuyển một cấu trúc đặc điểm để xử lý chuyển đổi thành loại được mong đợi bởi deadline_timer. Xem yêu cầu ASIO TimeTraits. Hầu hết là tầm thường, cuối cùng là không. Vì vậy, ví dụ:

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; 
    } 
}; 

Sau đó, bạn sẽ tạo thời gian chờ cho mỗi đồng hồ C++ 11 bạn muốn sử dụng. Ví dụ ở đây là dành cho std::system_clock. Bạn sẽ sử dụng bộ đếm giờ chót như bình thường.

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

Cảm ơn câu trả lời chi tiết, Dave. 'Basic_waitable_timer' sẽ hoạt động tốt với tôi vì tôi đang sử dụng 1,53. Nhiều nghĩa vụ. –