如何创建自定义计时时钟

时间:2017-03-05 19:38:08

标签: c++ chrono

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

我是否可以创建一个自定义时钟,开始时间为' 0'?

1 个答案:

答案 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';
}

只需要定义嵌套类型durationrepperiod,它们只能从steady_clock窃取,然后创建它自己的time_point {1}}。一个人不应该使用steady_clock&#39; time_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