← 模式
固定时间步
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
,并传入我们之前计算的时间点。这将阻塞当前线程,直到我们到达该时间点,确保执行在开始时间后恰好五秒钟继续,而不管复杂工作花费了多少时间(除非它花费了超过五秒)。
此技术最常用于循环中,以确保循环以固定的时间步长进行迭代。另外,如果你想休眠固定的时间量,请参阅休眠示例。