我正在创建时间轴UI控件,此时间轴上的时间总是从零开始,就像秒表一样。我想过使用std :: chrono :: steady_clock来保持开始和结束时间,但是,这里有一个时钟时间感觉不对,比如2017年3月10日上午'与规模的开始无关。
我是否可以创建一个自定义时钟,开始时间为' 0'?
答案 0 :(得分:3)
以下是一个基于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';
}
只需要定义嵌套类型duration
,rep
和period
,它们只能从steady_clock
窃取,然后创建它自己的time_point
{1}}。一个人不应该使用steady_clock
&#39; time_point
,因为MyClock
和steady_clock
的时代不同,你不想意外混合这两个time_point
算术。
由于MyClock
基于steady_clock
,因此is_steady
。
now()
函数将当前时间epoch
存储在static
中(在第一次调用时进行评估),然后找到自epoch
以来的时间每次被召唤。此减法创建duration
,可用于构造MyClock::time_point
。
我使用"chrono_io.h"
只是因为我在格式化方面懒惰。您不需要该标头来创建自己的自定义时钟。这只会使打印持续时间变得更容易。
这个程序只为我输出:
1618ns
82680ns
86277ns
88425ns