如何使用sleep_until获取自定义(计时)计时器?

时间:2014-03-26 10:42:19

标签: c++ c++11 chrono

我有一个自定义计时器模板,我想在std::this_thread::sleep_until()中使用它。所以我的now()方法如下所示:

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

我认为我的问题是我必须使用my_timer&lt;&gt;制作time_point as(模板)Clock参数,但现在不同的time_points之间存在转换。类似的东西:

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

可以找到代码here

我怎样才能让它发挥作用?此外,还有一个小的计时器,我可以在哪里找到一些如何创建自定义计时器的信息?

1 个答案:

答案 0 :(得分:3)

通过查看sleep_until,它使用time_point的clock template参数来查询当前时间。因此,这是在代码中定义时间点的正确方法:

#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