std :: chrono :: time_point设置为now

时间:2012-12-04 07:07:18

标签: c++ time c++11 chrono

我还是很新的库,我在std :: chrono上找到的文档对我来说不起作用。

我正在尝试实现一个包含时间戳的对象容器。对象将按照从最近到最近的顺序存储,我决定尝试使用std :: chrono :: time_point来表示每个时间戳。处理数据的线程将定期唤醒,处理数据,查看何时需要再次唤醒,然后休眠一段时间。

static std::chrono::time_point<std::chrono::steady_clock, std::chrono::milliseconds> _nextWakeupTime;

我的印象是上面的声明使用了毫秒精度的替代时钟。

下一步是将_nextWakeupTime设置为now;

的表示
_nextWakeupTime = time_point_cast<milliseconds>(steady_clock::now());

该行不会编译:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::chrono::time_point<_Clock,_Duration>' (or there is no acceptable conversion)
        with
        [
            _Clock=std::chrono::system_clock,
            _Duration=std::chrono::milliseconds
        ]
        chrono(298): could be 'std::chrono::time_point<_Clock,_Duration> &std::chrono::time_point<_Clock,_Duration>::operator =(const std::chrono::time_point<_Clock,_Duration> &)'
        with
        [
            _Clock=std::chrono::steady_clock,
            _Duration=std::chrono::milliseconds
        ]
        while trying to match the argument list '(std::chrono::time_point<_Clock,_Duration>, std::chrono::time_point<_Clock,_Duration>)'
        with
        [
            _Clock=std::chrono::steady_clock,
            _Duration=std::chrono::milliseconds
        ]
        and
        [
            _Clock=std::chrono::system_clock,
            _Duration=std::chrono::milliseconds
        ]

据我所知,在Windows系统上,stead_clock与system_clock相同,但我不知道这里发生了什么。我知道我可以这样做:

_nextWakeupTime += _nextWakeupTime.time_since_epoch();

我觉得这不是我应该做的好表现。


沿着同样的路线,实例化给定时钟/持续时间的time_point对象并将其设置为等于现在的最佳方法是什么?

1 个答案:

答案 0 :(得分:6)

您最简单的方法是提供_nextWakeupTime类型steady_clock::time_point

steady_clock::time_point _nextWakeupTime;

您可以使用time_point查询此steady_clock::time_point::period的分辨率,其中std::ratio为静态成员numden。< / p>

typedef steady_clock::time_point::period resolution;
cout << "The resolution of steady_clock::time_point is " << resolution::num
     << '/' <<resolution::den << " of a second.\n";

从您的错误消息中可以看出,您的供应商已将system_clock::time_pointsteady_clock::time_point设为相同的time_point,因此他们共享相同的时代,您可以将两者混合在算术中。为了便于处理这种情况,您可以使用以下命令查询time_point的时钟:

time_point::clock

即。在您的实施中,steady_clock::time_point::clock不是steady_clock,而是system_clock。如果你真的想要time_pointsteady_clock::time_point兼容,但分辨率为毫秒,你可以这样做:

time_point<steady_clock::time_point::clock, milliseconds> _nextWakeupTime;