如何创建自定义计时时钟

Jan*_*ans 4 c++ c++-chrono

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

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

How*_*ant 6

这是一个示例自定义计时时钟,它基于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';
}
Run Code Online (Sandbox Code Playgroud)

一个只需要定义嵌套类型durationrep并且period它可以从刚刚偷steady_clock,然后创建它自己time_point。一个不应该使用steady_clocktime_point,因为时代MyClocksteady_clock不同,你不希望意外混合这两个time_point的算术。

既然MyClock是基于steady_clock,它is_steady

并且该now()函数将当前时间存储epoch在 a 中static(在第一次被调用时计算),然后从epoch每次调用它开始查找时间。此减法创建 a duration,可用于构造 a MyClock::time_point

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

这个程序只是为我输出:

1618ns
82680ns
86277ns
88425ns
Run Code Online (Sandbox Code Playgroud)