我正在创建一个时间轴 UI 控件,该时间轴上的时间始终从零开始,就像秒表一样。我想过使用 std::chrono::steady_clock 将开始和结束时间保持在刻度上,但是,在这里设置时钟时间感觉不对,例如“2017 年 3 月 10 点”与开始时间无关规模。
我应该/可以创建一个从“0”开始时间的自定义时钟吗?
这是一个示例自定义计时时钟,它基于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)
一个只需要定义嵌套类型duration,rep并且period它可以从刚刚偷steady_clock,然后创建它自己time_point。一个不应该使用steady_clock的time_point,因为时代MyClock和steady_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)