2013-05-23 29 views
13

Asio son tarih sayaçlarını kullanan bir uygulamam var. Uygulamanın geri kalanı, zaman değerleri için std::chrono yapılarını kullanır ve boost::posix_time'u yalnızca asio'ya dokunan öğeler için kullanmak gariptir. Elimden eğer vb tutarlılık, okunabilirlik için, uygulama boyunca std::chrono kullanmak istiyorumboost :: asio :: std :: chrono zaman değerleri olan deadline_timer

Cevabın Zamanlayıcı'nın şablonu kullanarak yer alacağı geliyor bana: Bu darbeler hariç

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

Yani, yeni bir traits_type oluşturmak gerekiyor ve bunu kullanarak bir deadline_timer_service ilan edebilir gibi görünüyor, ama ben: kötü derleme zamanında ... buna benzer, çoğu olan hatanın birçok hatları, at emin değilim nasıl/whe yeniden. Bu sorunun çözüldüğüne inanmak zorundayım. Linux üzerinde -std = C++ 11 ile g ++ 4.7.3 kullanıyorum, çapraz derleme.

cevap

24

Yükseltme 1.49 veya sonraki bir sürümünü kullanıyorsanız, ASIO, std::chrono veya boost::chrono'dan ya C++ 11 uyumlu saat kullanan basic_waitable_timer ürününü tanıttı. Ayrıca, steady_clock, system_clock ve high_resolution_clock'un yükseltme sürümleri için önceden tanımlanmış typedefs sağladılar. İşlevleri deadline_timer ile aynıdır, ancak boost::posix_time yapıları yerine C++ 11 saat mekanizmalarını kullanır.

Daha önceki sürümler için, dönüştürmeyi, deadline_timer tarafından beklenen türle işlemek için bir özellik yapısı geçirmeniz gerekecek. ASIO TimeTraits gereksinimlerine bakın. Çoğu önemsiz, son değil. Yani, örneğin

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

için Ardından kullanmak istediğiniz her C++ 11 saat için son zamanlayıcılar yaratacak. Buradaki örnek std::system_clock içindir. Bu son tarih sayacını normal olarak kullanırsınız.

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

Ayrıntılı yanıt için teşekkürler, Dave. 'Basic_waitable_timer' 1.53 kullanıyorum çünkü benim için sadece iyi çalışacaktır. Çok minnettarım. –

İlgili konular