【问题标题】:How to create a custom chrono clock如何创建自定义计时时钟
【发布时间】:2017-07-25 13:54:26
【问题描述】:

我正在创建一个时间线 UI 控件,该时间线上的时间总是从零开始,就像秒表一样。我曾想过使用 std::chrono::steady_clock 来保持刻度上的开始和结束时间,但是,在这里有一个时钟时间感觉不对,比如“2017 年 3 月 10 日上午 10 点”与开始时间无关规模。

我应该/我可以创建一个从“0”开始的自定义时钟吗?

【问题讨论】:

  • 可以创建一个从 0 开始的自定义时钟。很难说您是否应该这样做,因为我不知道如何使用您的 time_points。它们是否需要在程序运行期间保持稳定,或导出/导入到其他进程?他们需要纳秒级精度吗?第二精度?分钟精度?只需从现有时钟中存储now() 并从未来时间中减去它就足够了吗?您有可以向我们展示的代码示例用例吗?
  • 感谢霍华德的回应,顺便说一句,喜欢你的 cppcon chrono 谈话。存储 stable_clock time_point 对我有用。要回答您的问题,time_points 是流程内部的,所以不用担心,但我确实需要纳秒级精度。
  • 我想我会使用普通的stead_clock。出于兴趣,我如何定义一个类似于 stable_clock 但纪元为 0 的类型?我想尝试一下:)

标签: c++ chrono


【解决方案1】:

这是一个基于steady_clock 的自定义计时时钟示例,它计算自第一次调用以来的时间(大约):

#include "chrono_io.h"
#include <chrono>
#include <iostream>

struct MyClock
{
    using duration   = std::chrono::steady_clock::duration;
    using rep        = duration::rep;
    using period     = duration::period;
    using time_point = std::chrono::time_point<MyClock>;
    static constexpr bool is_steady = true;

    static time_point now() noexcept
    {
        using namespace std::chrono;
        static auto epoch = steady_clock::now();
        return time_point{steady_clock::now() - epoch};
    }
};

int
main()
{
    using namespace date;
    std::cout << MyClock::now().time_since_epoch() << '\n';
    std::cout << MyClock::now().time_since_epoch() << '\n';
    std::cout << MyClock::now().time_since_epoch() << '\n';
    std::cout << MyClock::now().time_since_epoch() << '\n';
}

只需要定义嵌套类型durationrepperiod,它可以从steady_clock 窃取,然后创建它自己的time_point。不应使用steady_clocktime_point,因为MyClocksteady_clock 的纪元不同,并且您不想在算术中意外混合这两个time_point

由于MyClock是基于steady_clock,所以它是is_steady

now() 函数将当前时间epoch 存储在static 中(在第一次调用它时进行评估),然后每次调用它时只查找自epoch 以来的时间。这个减法创建了一个duration,它可以用来构造一个MyClock::time_point

我使用"chrono_io.h" 只是因为我的格式很懒惰。您不需要该标题来创建自己的自定义时钟。这只会使打印持续时间变得更容易。

这个程序只是为我输出:

1618ns
82680ns
86277ns
88425ns

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 2013-05-08
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多