如何通过C语言定时器实现简单任务延时执行?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1021个文字,预计阅读时间需要5分钟。
它仅能让当前线程暂停一段时间,不支持周期性触发、也不支持异步回调。若只想3秒后打印一行字,用它最轻量;但想每5秒检查一次文件是否存在,则不够用。
常见错误现象:std::this_thread::sleep_for 被误放在循环里却没考虑精度漂移,或者在 GUI 主线程里直接调用导致界面冻结。
- 只适用于阻塞式、单次、非实时要求的延时(比如模拟网络延迟)
- 参数是
std::chrono::duration,别传毫秒整数——写成sleep_for(1000)会编译失败,得写sleep_for(std::chrono::milliseconds(1000)) - 在 Windows 上最小精度约 15ms,Linux 可能更准,但别依赖亚毫秒级响应
std::thread + std::condition_variable 实现简易可取消定时器
这是 C++11 标准下最可控的手动方案:用一个后台线程等待,用条件变量做唤醒和取消。比 sleep_for 多一层封装,但完全不依赖第三方库。
使用场景:需要启动/停止控制、支持提前终止、任务执行时间短且不频繁(比如心跳上报、配置轮询)。
本文共计1021个文字,预计阅读时间需要5分钟。
它仅能让当前线程暂停一段时间,不支持周期性触发、也不支持异步回调。若只想3秒后打印一行字,用它最轻量;但想每5秒检查一次文件是否存在,则不够用。
常见错误现象:std::this_thread::sleep_for 被误放在循环里却没考虑精度漂移,或者在 GUI 主线程里直接调用导致界面冻结。
- 只适用于阻塞式、单次、非实时要求的延时(比如模拟网络延迟)
- 参数是
std::chrono::duration,别传毫秒整数——写成sleep_for(1000)会编译失败,得写sleep_for(std::chrono::milliseconds(1000)) - 在 Windows 上最小精度约 15ms,Linux 可能更准,但别依赖亚毫秒级响应
std::thread + std::condition_variable 实现简易可取消定时器
这是 C++11 标准下最可控的手动方案:用一个后台线程等待,用条件变量做唤醒和取消。比 sleep_for 多一层封装,但完全不依赖第三方库。
使用场景:需要启动/停止控制、支持提前终止、任务执行时间短且不频繁(比如心跳上报、配置轮询)。

