Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::chrono的时间戳-如何';过滤器';基于相对时间的数据?_C++_Time_Chrono - Fatal编程技术网

C++ 使用std::chrono的时间戳-如何';过滤器';基于相对时间的数据?

C++ 使用std::chrono的时间戳-如何';过滤器';基于相对时间的数据?,c++,time,chrono,C++,Time,Chrono,我想对我生成的数据流进行时间标记,我想使用std::chrono::Stadium_clock 这些时间戳和数据一起存储(作为uint64值的数组?),稍后我将需要再次处理这些时间戳 现在,我还没有使用std::chrono库,所以我确实需要一些关于这个库的语法和最佳实践的帮助 我可以使用以下方法获取和存储值: uint64\u t timestamp=std::chrono::stable\u clock::now().time\u since\u epoch().count(); 但我如何

我想对我生成的数据流进行时间标记,我想使用std::chrono::Stadium_clock

这些时间戳和数据一起存储(作为uint64值的数组?),稍后我将需要再次处理这些时间戳

现在,我还没有使用std::chrono库,所以我确实需要一些关于这个库的语法和最佳实践的帮助

我可以使用以下方法获取和存储值:

uint64\u t timestamp=std::chrono::stable\u clock::now().time\u since\u epoch().count();
但我如何才能做到最好:

  • 读取数据时,是否从uint64创建时间点

  • 获取稳定时钟的每秒滴答数(uint64)值

  • 找到一个“截止”时间点(如uint64),该时间点位于给定时间点之前的特定时间(以秒为单位)

以上代码片段将不胜感激


我想结合以上三种方法来完成以下工作:拥有一个(增加的)时间戳值数组(如uint64),我想截断它,这样所有比上一个时间戳早X秒的数据都会被丢弃。

参考手册是一个看起来很好的地方:

在这种情况下,您正在寻找:

因为实际上你使用的是一个以“历元”1/1/70为原点,以毫秒为单位的时钟。 然后,只需对持续时间进行算术运算,即可完成所需的截止时间:


每个链接页面的底部都有代码示例。

参考手册是一个可以像往常一样查看的好地方:

在这种情况下,您正在寻找:

因为实际上你使用的是一个以“历元”1/1/70为原点,以毫秒为单位的时钟。 然后,只需对持续时间进行算术运算,即可完成所需的截止时间:


每个链接页面的底部都有代码示例。

让我们看看您可能在CPP参考文档中使用的功能

首先,你需要决定你想用哪个时钟。有您建议的
稳定时钟
高分辨率时钟
系统时钟

高分辨率时钟
依赖于实现,所以除非我们真的需要它,否则我们还是把它放在一边吧。
稳定时钟
保证是单调的,但无法保证您得到的值的意义。它非常适合对事件进行排序或测量它们的间隔,但您无法从中获得时间点

另一方面,
system\u clock
有一个含义,它是UNIX时代,因此可以从中获取时间值,但不能保证是单调的

要获取
稳定时钟的周期(持续时间为一个滴答声),您有
周期成员:

auto period = std::chrono::steady_clock::period();
std::cout << "Clock period " << period.num << " / " << period.den << " seconds" << std::endl;
std::cout << "Clock period " << static_cast<double>(period.num) / period.den << " seconds" << std::endl;
并使用
tuc
作为截止点

但是,不要依赖于std::chrono::stable_clock::now().time_since_epoch().count()获得有意义的东西-只是一个数字。
稳定时钟的纪元通常是引导时间。如果你需要时间,你应该使用
系统时钟
(记住这不是单调的)


C++20a引入了更多可转换为时间的时钟。

让我们看看您在CPP参考文档中可能使用的功能

首先,你需要决定你想用哪个时钟。有您建议的
稳定时钟
高分辨率时钟
系统时钟

高分辨率时钟
依赖于实现,所以除非我们真的需要它,否则我们还是把它放在一边吧。
稳定时钟
保证是单调的,但无法保证您得到的值的意义。它非常适合对事件进行排序或测量它们的间隔,但您无法从中获得时间点

另一方面,
system\u clock
有一个含义,它是UNIX时代,因此可以从中获取时间值,但不能保证是单调的

要获取
稳定时钟的周期(持续时间为一个滴答声),您有
周期成员:

auto period = std::chrono::steady_clock::period();
std::cout << "Clock period " << period.num << " / " << period.den << " seconds" << std::endl;
std::cout << "Clock period " << static_cast<double>(period.num) / period.den << " seconds" << std::endl;
并使用
tuc
作为截止点

但是,不要依赖于std::chrono::stable_clock::now().time_since_epoch().count()获得有意义的东西-只是一个数字。
稳定时钟的纪元通常是引导时间。如果你需要时间,你应该使用
系统时钟
(记住这不是单调的)


C++20a引入了更多可转换为时间的时钟。

由于我今天花了太长时间才从各种来源弄明白,我将在这里发布我的解决方案,作为自我回答。(如果有不正确的地方或可以做得更好,我将非常感谢您的评论。)

获取时钟的周期(以秒为单位)和滴答声/秒值 获取时钟的时间点(now)作为数据流时间戳的uint64值 获取给定存储uint64值的时钟时间点 最后一次(uint64到时间点)最让我烦恼。需要的关键见解是:

  • (在Win10上)系统时钟使用100纳秒的时间分辨率。因此,不能直接将
    std::chrono::nanoseconds
    添加到其本机时间点。(
    std::chrono:system\u clock\u time\u point

  • 但是,由于刻度为100纳秒,因此也不能使用下一个更高的持续时间单位(微秒),因为它不能表示为整数值

  • 可以使用显式转换到微秒,但这会降低刻度的0.1U分辨率

  • 正确的方法是使用系统时钟自身的持续时间,并使用存储的滴答值直接初始化它

在我的搜索中,我发现以下资源最有帮助:

  • using namespace std::chrono; auto period = system_clock::period(); double period_s = (double) period.num / period.den; uint64 tps = period.den / period.num;
    using namespace std::chrono;
    system_clock::time_point tp_now = system_clock::now();
    uint64 nowAsTicks = tp_now.time_since_epoch().count();
    using namespace std::chrono;
    uint64 givenTicks = 12345;  // Whatever the value was
    system_clock::time_point tp_recreated = system_clock::time_point{} + system_clock::duration(givenTicks);
    uint64 recreatedTicks = tp_now.time_since_epoch().count();
    Assert( givenTicks == recreatedTicks );  // has to be true now