制作自己的时钟是否足够取决于您如何使用您创建的持续时间。例如,如果您想以半速运行,但在某处调用:
std::this_thread::sleep_for(std::chrono::minutes(2));
持续时间不会调整。相反,您需要使用 sleep_until 并提供一个使用“慢”时钟的时间点。但是制作一个运行缓慢的时钟非常容易:
template<typename Clock,int slowness>
struct slow_clock {
using rep = typename Clock::rep;
using period = typename Clock::period;
using duration = typename Clock::duration;
using time_point = std::chrono::time_point<slow_clock>;
constexpr static bool is_steady = Clock::is_steady;
static time_point now() {
return time_point(start_time.time_since_epoch() + ((Clock::now() - start_time)/slowness));
}
static const typename Clock::time_point start_time;
};
template<typename Clock,int slowness>
const typename Clock::time_point
slow_clock<Clock,slowness>::start_time = Clock::now();
从 now() 返回的 time_points 似乎会以相对于您给它的时钟较慢的速度前进。例如,这是一个程序,因此您可以通过以下方式缓慢观察纳秒:
int main() {
using Clock = slow_clock<std::chrono::high_resolution_clock,500000000>;
for(int i=0;i<10;++i) {
std::this_thread::sleep_until(Clock::now()
+ std::chrono::nanoseconds(1));
std::cout << "tick\n";
}
}
您实现的所有功能,例如MessageQueue::poll()
,可能都需要根据全局时钟 typedef 来实现。
当然,这一切都与程序实际运行的速度无关,除非您根据它们减慢程序的速度。超时的函数会花费更长的时间,sleep_until 会花费更长的时间,但不等待未来某个时间点的操作只会显得更快。
// appears to run a million times faster than normal according to (finish-start)
auto start = slow_clock<steady_clock,1000000>::now();
do_slow_operation();
auto finish = slow_clock<steady_clock,1000000>::now();