以下代码是否正确
pushEvent(std::chrono::steady_clock::now() + dt, event_obj);
//...
auto now=std::chrono::steady_clock::now();
if(event.expireTime<=now)
{
event.fire();
}
//...
我有点担心环绕行为,因为我知道至少有两个错误[1]和[2],这是由于时间计数器中的环绕而引入的。我的想法可能会发生:
该事件会提前触发 ,因为std::chrono::steady_clock::now() + dt
将小于std::chrono::steady_clock::now()
事件触发迟到,因为std::chrono::steady_clock::now()
可能已经环绕。
[1] https://www.cnet.com/news/windows-may-crash-after-49-7-days/
答案 0 :(得分:1)
您可以使用steady_clock::time_point
检查steady_clock::time_point::max().time_since_epoch()
的范围。这将返回chrono::duration
,这是自steady_clock
纪元以来的最长时间。时代本身没有具体说明。但是这个:
auto time_left = steady_clock::time_point::max() - steady_clock::now();
为您提供直到max()
被击中的剩余时间。 time_left
的确切单位可以通过以下方式进行检查:
using D = decltype(time_left);
std::cout << D::period::num << '/' << D::period::den << '\n';
在每个平台上输出:
1/1000000000
表示单位为纳秒。所以你可以:
std::cout << time_left.count() << "ns\n";
如果您愿意使用我的free, header-only date/time library,它会对您进行反省,您可以这样做:
using date::operator<<;
std::cout << time_left << "\n";
对我来说这是输出:
9221890448824928278ns
大约是292年。如果您的代码在我的平台上运行,它可能会在292年内完成。您的平台可能类似,这就是您可以测试的平台。