能否让std::this_thread::sleep_for适配自定义加速speedy_clock?
问题分析与解决方案
你的现有方案不可行,因为std::this_thread::sleep_for的行为绑定系统真实时钟——它等待的是真实时间流逝指定时长,和你自定义的speedy_clock完全无关,不会自动改用模拟时钟的时间基准。
核心问题
std::this_thread::sleep_for的参数是无关联时钟的duration,逻辑是“让线程暂停运行X单位的真实时间”,而非“等待模拟时钟走过X单位”。你的speedy_clock仅提供模拟时间的获取接口,无法影响sleep_for的底层行为。
必须自行实现适配模拟时钟的sleep函数
要实现“基于加速模拟时钟的睡眠”,你需要编写一个类似speedy_sleep_for的函数,核心逻辑有两种思路:
思路1:等待模拟时间达到目标值(通用适配,支持变速模拟)
这是最可靠的方案,即使模拟时钟的加速倍数动态变化也能正常工作:
template<typename Duration> void speedy_sleep_for(Duration sleep_duration) { using time_point = speedy_clock::time_point; time_point start = speedy_clock::now(); time_point target = start + sleep_duration; // 循环等待模拟时间到达目标点,期间用短时间真实sleep避免空转占用CPU while (speedy_clock::now() < target) { // 每次真实睡眠1毫秒,可根据精度需求调整 std::this_thread::sleep_for(std::chrono::milliseconds(1)); } }
思路2:按加速倍数计算真实睡眠时长(仅适用于固定倍数的匀速模拟)
如果模拟时钟加速倍数固定(比如始终是真实时间的2倍),可直接计算真实睡眠时长,效率更高:
constexpr double SIMULATION_SPEEDUP_FACTOR = 2.0; // 模拟时钟速度是真实时间的2倍 template<typename Duration> void speedy_sleep_for(Duration sleep_duration) { // 将模拟时长转换为真实时长 auto real_duration = std::chrono::duration_cast<std::chrono::microseconds>( sleep_duration / SIMULATION_SPEEDUP_FACTOR ); std::this_thread::sleep_for(real_duration); }
你的speedy_clock存在的bug
注意到speedy_clock中time_point的定义错误:
using time_point = std::chrono::time_point<motion_clock>;
应改为与自身时钟类型匹配的定义,否则会导致后续时间计算异常:
using time_point = std::chrono::time_point<speedy_clock>;
代码替换建议
你需要将代码中所有std::this_thread::sleep_for调用替换为自己实现的speedy_sleep_for。若想减少临时重构工作量,可使用IDE的全局文本替换功能批量修改,不推荐用宏定义长期替换(易引发意外问题)。
内容的提问来源于stack exchange,提问作者Flo Ryan
相关产品推荐
相关产品推荐

