2014-03-26 19 views
1

我有一個自定義計時器模板,我想在std::this_thread::sleep_until()中使用。所以我now()方法是這樣的:如何讓定製(計時器)計時器與sleep_until一起工作?

static time_point now() { 
    return time_point(timer_T::now() - epoch_); 
} 

其中epoch_timer_T::now()初始化。現在我想能夠sleep_until特定的時間點。

std::this_thread::sleep_until(my_timer<>::now() + std::chrono::seconds(1)); 

我想我的問題是,我必須作出time_point與my_timer <>爲(模板)Clock的說法,但現在則有不同的time_points之間的轉換。例如:

using time_point = std::chrono::time_point<my_timer<timer_T>>; 

代碼可以找到here

我該如何讓這個工作?另外,是否有一個小巧的chrono howto,在那裏我可以找到一些信息如何創建一個自定義計時器?

+1

您正在改變time_point的含義,它必須存儲自定義時代以來的持續時間。如果你沒有遵循規則,依賴於該規則的API無法工作。通過隱式轉換爲實時time_point創建自己完全不同的時間點類。 – galop1n

+0

是真的,但是紀元沒有在標準中定義,所以我認爲創建一個自己的時鐘應該是這樣的,因爲time_point是基於你給出的作爲模板參數的時鐘。 – user1810087

+0

是的,創建自己的時鐘是可以的,它可以使用任何它需要的時代。 「時代」並不意味着「1970年的第一天的午夜」;這就是「UNIX時代」的意義所在。 「時代」的意思很簡單,就是「參考日期」。 –

回答

3

通過查看sleep_until,它使用time_point的時鐘模板參數來查詢當前時間。所以,這裏是你的代碼來定義時間點的正確方法:

#include <chrono> 
#include <thread> 
#include <iostream> 

template<typename timer_T = std::chrono::steady_clock> 
class my_timer { 
public: 

    using timer_type = timer_T; 
    using time_point = std::chrono::time_point<my_timer, typename timer_T::time_point::duration >; 
    using duration = typename timer_T::duration; 
    using rep = typename duration::rep; 
    using period  = typename duration::period; 

    static const bool is_steady = timer_T::is_steady; 

    static time_point now() { 
     return time_point(timer_T::now() - epoch_); 
    } 

private: 
    static typename timer_T::time_point epoch_; 
}; 

template<typename T> 
typename T::time_point my_timer<T>::epoch_ = T::now(); 


int main(int, char*[]) { 
    for(int i=0; i<5; i++) { 
     std::cout << my_timer<>::now().time_since_epoch().count() << "\n"; 
     std::this_thread::sleep_until(my_timer<>::now() + std::chrono::seconds(3)); 
    } 
} 

工作here

+0

其實我已經試過這個,但問題是,它沒有工作。現在它仍然不工作在** Visual Studio 2013 ** ...(我嘗試使用boost計時器,它很好......我認爲還有一個問題(再次)與std :: chrono爲msvc實現。 – user1810087

+0

剛剛看了一下VS2013的實現,是的,它不符合...我建議你填寫微軟連接的錯誤報告。 – galop1n

+0

+1這也適用於libC++。 –