2017-09-01 47 views
1

这篇文章的标题行实际上只是我问题的一半(简单的一半)。所以,我会回过头来谈谈我想要做的事情。在std :: chrono时钟之间施放time_points

std::chrono测量经过时间非常简单。但是,到目前为止,我还没有看到任何“计时器”的实现可以完成秒表的圈数。也就是说,当您想要开始跟踪时间间隔时,请致电Timer.start(),并且每次要录制间隔时请致电Timer.tick()。然后,在快速结束后,您可以回顾所记录的时间间隔列表;也许是平均水平和1%的高位或什么的。另外,因为我使用了很多,我想任意询问计时器自午夜以来已经过了多少微秒。

这个虚构类的构造函数的第一个任务是在内部设置午夜。最初,我是通过this的技术来做这个精彩的答案。当我去实现我的Timer类的概念时,我意识到我想要使用high_resolution_clocksteady_clock(尽管system_clock在我的平台上使用了纳秒间隔)。然后出现这个问题:如何设置chrono::steady_clock::time_point到午夜?

只有system_clockto_time_tfrom_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_clocksteady_clock一个time_point的值为“今天午夜”
  • 我可以转换system_clock::time_point使用与不同的chrono时钟?

当然,我很乐意指出一个更好的方法来处理这一切,如果它仍然符合我上面的总体目标。

在此先感谢。 =)

+1

一个复杂因素是system_clock可能每年跳两次(DST)。 steady_clock不是。 –

+0

啊是的。为了我的目的,这个定时器永远不会运行超过几个小时。 – musasabi

+0

我有时会在程序启动时捕捉一个时间点。随后的任何时间点都可以计算程序开始后的持续时间。这是合理的吗?我相信启动时间点可以用'挂钟'时间捕获。我认为这将是一个简单的模块化算法,可以将所有单圈时间调整为ms-since-midnight。 –

回答

2

计算系统时钟的午夜。

“同时”(大约)为系统时钟和想要午夜的时钟获取时间点。调用此时间点X.

将系统时钟的时间间隔从午夜转换为X.转换为皮秒(或任何分辨率)的持续时间。

您现在有时间从午夜开始,时间为X点,时间为您想要的午夜时间。

请注意,这将基本上是近似的,因为“时间X”将成为系统时钟和您关心的时钟的分界线。但是它只会差别大约计算时间戳的时间。如果你真的在意,你可以做两个系统时钟样本来提供目标时钟,并平均自午夜以来的时间。

相关问题