← 模式

固定时间步

12345678910111213141516#include <chrono> #include <thread> using namespace std::literals::chrono_literals; void some_complex_work(); int main() { using clock = std::chrono::steady_clock; clock::time_point next_time_point = clock::now() + 5s; some_complex_work(); std::this_thread::sleep_until(next_time_point); }

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

阻塞一个线程的执行,直到一个固定的时间点。

描述

为了演示此模式,我们使用 std::chrono::steady_clock第 10 行),但其他任何时钟也都可以。

第 11 行,我们创建了一个表示从现在起五秒后的时间点的 clock::time_point。为此,我们使用 clock::now() 获取当前时间点,并加上 5s 的时长。这里我们使用了 C++14 的一个时长字面量后缀,即带有秒后缀 s 的时长。为了使用这些后缀,第 4 行using 指令是必需的。对于 C++11,可以手动构造时长。

第 13 行执行了一些复杂的工作后,我们在第 15 行调用 std::this_thread::sleep_until,并传入我们之前计算的时间点。这将阻塞当前线程,直到我们到达该时间点,确保执行在开始时间后恰好五秒钟继续,而不管复杂工作花费了多少时间(除非它花费了超过五秒)。

此技术最常用于循环中,以确保循环以固定的时间步长进行迭代。另外,如果你想休眠固定的时间量,请参阅休眠示例

贡献者

  • Joseph Mansfield

最后更新

2018年8月27日

来源

在 GitHub 上 Fork 此模式

分享