4

我对这些库还是很陌生,我可以在 std::chrono 上找到的文档对我不起作用。

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

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

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

下一步是将 _nextWakeupTime 设置为现在的表示;

_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 对象并将其设置为等于现在的最佳方法是什么?

4

1 回答 1

8

对你来说最简单的事情就是给出_nextWakeupTimetype steady_clock::time_point

steady_clock::time_point _nextWakeupTime;

您可以查询 this 的解决方案time_point是什么steady_clock::time_point::period,这为您提供std::ratio了静态成员numden.

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_point,它们steady_clock::time_point是相同的time_point,因此它们共享相同的时期,您可以在算术中混合两者。为了便于处理这种情况,您可以查询 atime_point的时钟:

time_point::clock

即在您的实现steady_clock::time_point::clock中不是steady_clockbut system_clock。如果你真的想要一个time_point兼容steady_clock::time_point但具有毫秒分辨率的,你可以这样做:

time_point<steady_clock::time_point::clock, milliseconds> _nextWakeupTime;
于 2012-12-04T15:37:52.257 回答