我还是很新的库,我在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对象并将其设置为等于现在的最佳方法是什么?
答案 0 :(得分:6)
您最简单的方法是提供_nextWakeupTime
类型steady_clock::time_point
。
steady_clock::time_point _nextWakeupTime;
您可以使用time_point
查询此steady_clock::time_point::period
的分辨率,其中std::ratio
为静态成员num
和den
。< / 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_point
和steady_clock::time_point
设为相同的time_point
,因此他们共享相同的时代,您可以将两者混合在算术中。为了便于处理这种情况,您可以使用以下命令查询time_point
的时钟:
time_point::clock
即。在您的实施中,steady_clock::time_point::clock
不是steady_clock
,而是system_clock
。如果你真的想要time_point
与steady_clock::time_point
兼容,但分辨率为毫秒,你可以这样做:
time_point<steady_clock::time_point::clock, milliseconds> _nextWakeupTime;