这篇文章的标题行实际上只是我问题的一半(简单的一半)。所以,我会回过头来谈谈我想要做的事情。在std :: chrono时钟之间施放time_points
用std::chrono
测量经过时间非常简单。但是,到目前为止,我还没有看到任何“计时器”的实现可以完成秒表的圈数。也就是说,当您想要开始跟踪时间间隔时,请致电Timer.start()
,并且每次要录制间隔时请致电Timer.tick()
。然后,在快速结束后,您可以回顾所记录的时间间隔列表;也许是平均水平和1%的高位或什么的。另外,因为我使用了很多,我想任意询问计时器自午夜以来已经过了多少微秒。
这个虚构类的构造函数的第一个任务是在内部设置午夜。最初,我是通过this的技术来做这个精彩的答案。当我去实现我的Timer
类的概念时,我意识到我想要使用high_resolution_clock
或steady_clock
(尽管system_clock
在我的平台上使用了纳秒间隔)。然后出现这个问题:如何设置chrono::steady_clock::time_point
到午夜?
只有system_clock
有to_time_t
和from_time_t
,并且,只要我可以告诉大家,这是在某种程度上chrono
理解来表达“今天午夜”的唯一途径。对于我昨晚的所有阅读,我找不到一种方法将system_clock::time_point
转换为steady_clock::time_point
。我最近的尝试是:
typedef std::conditional<std::chrono::high_resolution_clock::is_steady,
std::chrono::high_resolution_clock,
std::chrono::steady_clock>::type TimerClock;
TimerClock::time_point midnight;
chrono::system_clock::time_point current_time = chrono::system_clock::now();
time_t raw_time = chrono::system_clock::to_time_t(current_time);
tm *tm_midnight = localtime(&raw_time);
tm_midnight->tm_hour = 0;
tm_midnight->tm_min = 0;
tm_midnight->tm_sec = 0;
midnight = chrono::system_clock::from_time_t(mktime(tm_midnight));
但显然这不会飞。据我所知,chrono::time_point_cast
旨在让您访问来自相同时钟类型的不同分辨率。
这给我留下了两条路线/问题:
- 我可以直接设置从
high_precision_clock
或steady_clock
一个time_point
的值为“今天午夜” - 我可以转换
system_clock::time_point
使用与不同的chrono
时钟?
当然,我很乐意指出一个更好的方法来处理这一切,如果它仍然符合我上面的总体目标。
在此先感谢。 =)
一个复杂因素是system_clock可能每年跳两次(DST)。 steady_clock不是。 –
啊是的。为了我的目的,这个定时器永远不会运行超过几个小时。 – musasabi
我有时会在程序启动时捕捉一个时间点。随后的任何时间点都可以计算程序开始后的持续时间。这是合理的吗?我相信启动时间点可以用'挂钟'时间捕获。我认为这将是一个简单的模块化算法,可以将所有单圈时间调整为ms-since-midnight。 –