新闻中心
C++怎么实现一个计时器(Timer)_C++多线程与高精度时间测量
使用std::chrono和std::thread可实现高精度跨平台计时器,支持单次与周期性任务。1. 通过steady_clock测量时间间隔;2. 结合sleep_until实现延时执行;3. 封装Timer类管理线程安全的定时任务;4. 多定时任务宜用优先队列统一调度以提升效率。

在C++中实现一个计时器(Timer),尤其是结合多线程和高精度时间测量时,需要使用现代C++标准库中的 std::chrono 和 std::thread。这种方式不仅跨平台,而且能提供微秒甚至纳秒级的精度。
1. 使用 std::chrono 实现高精度时间测量
C++11 引入了 std::chrono,它提供了对时间点(time_point)、时间段(duration)和时钟(clock)的封装,适合做高精度计时。
常用时钟类型:
- std::chrono::steady_clock:单调递增,不受系统时间调整影响,推荐用于计时。
- std::chrono::high_resolution_clock:最高精度时钟,通常就是 steady_clock 的别名。
示例:测量代码执行时间
#include <iostream>
#include <chrono>
<p>int main() {
auto start = std::chrono::steady_clock::now();</p><pre class='brush:php;toolbar:false;'>// 模拟耗时操作
for (int i = 0; i < 1000000; ++i) {
// do nothing
}
auto end = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "耗时: " << duration.count() << " 微秒\n";
return 0;}
2. 实现单次/周期性定时任务(Timer)
可以利用 std::thread 和 std::this_thread::sleep_until 来实现一个简单的定时器。
目标:在指定时间后执行函数,或周期性执行。
美图云修
商业级AI影像处理工具
50
查看详情
#include <iostream>
#include <chrono>
#include <thread>
#include <functional>
<p>void simple_timer(int delay_ms, std::function<void()> task) {
auto wake_time = std::chrono::steady_clock::now() +
std::chrono::milliseconds(delay_ms);
std::this_thread::sleep_until(wake_time);
task();
}</p><p>// 周期性执行
void periodic_timer(int interval_ms, int times, std::function<void()> task) {
for (int i = 0; i < times; ++i) {
auto next_time = std::chrono::steady_clock::now() +
std::chrono::milliseconds(interval_ms);
task();
std::this_thread::sleep_until(next_time);
}
}</p>调用示例:
int main() {
simple_timer(1000, []() {
std::cout << "1秒后执行\n";
});
<pre class='brush:php;toolbar:false;'>periodic_timer(500, 3, []() {
std::cout << "周期任务执行\n";
});
return 0;}
3. 多线程安全的 Timer 类设计
如果要支持多个定时任务并行运行,应将每个定时器放在独立线程中,避免阻塞主线程。
class Timer {
public:
Timer() : running(false) {}
<pre class='brush:php;toolbar:false;'>~Timer() {
stop();
}
void start_once(int delay_ms, std::function<void()> task) {
stop();
running = true;
thread = std::thread([=]() {
auto target = std::chrono::steady_clock::now() +
std::chrono::milliseconds(delay_ms);
std::this_thread::sleep_until(target);
if (running) task();
});
}
void start_periodic(int interval_ms, std::function<void()> task) {
stop();
running = true;
thread = std::thread([=]() {
while (running) {
auto next_time = std::chrono::steady_clock::now() +
std::chrono::milliseconds(interval_ms);
task();
std::this_thread::sleep_until(next_time);
}
});
}
void stop() {
running = false;
if (thread.joinable()) {
thread.join();
}
}private: std::thread thread; bool running; };
使用方式:
int main() {
Timer timer;
timer.start_once(1000, []() {
std::cout << "一次性任务\n";
});
<pre class='brush:php;toolbar:false;'>std::this_thread::sleep_for(std::chrono::seconds(2));
timer.start_periodic(300, []() {
std::cout << "每300ms执行一次\n";
});
std::this_thread::sleep_for(std::chrono::seconds(2));
return 0;}
4. 注意事项与优化建议
- 优先使用 std::chrono::steady_clock,避免系统时间跳变影响计时。
- sleep_until 虽然高精度,但实际精度受限于操作系统的调度粒度(通常为1-15ms)。
- 频繁短间隔定时任务可能因线程调度延迟而无法精确执行,考虑使用事件循环或定时器轮询机制(如基于 epoll 或 IOCP)提升效率。
- 若需大量定时器,可使用 std::priority_queue 管理超时任务,配合一个工作线程统一调度。
基本上就这些。C++ 中实现 Timer 不复杂,关键是选对时钟和线程控制方式。
以上就是C++怎么实现一个计时器(Timer)_C++多线程与高精度时间测量的详细内容,更多请关注其它相关文章!
# c++计时器
# 操作系统
# c++多线程
# 津南区皮具网站建设
# 岳阳网站建设的市场费用
# 阳泉网站网络推广哪家好
# 安徽关键词排名怎么样做
# 重庆大型网站建设特征
# SEO飞唯
# 马陆营销推广报价
# 众人网络优化网站方法
# 网页设计不用优化的网站
# 武胜网站建设哪个好
# 放在
# 多模
# 头文件
# 客户端
# 如何实现
# 如何使用
# 美图
# 计时器
# 多线程
# 标准库
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
html5 app怎么运行环境_配html5 app运行环境【教程】
Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求
汽车之家官方网站官网入口_汽车之家网页版直接进入
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
Lar*el Excel导入时生成自定义递增ID的策略与实践
快手赚钱渠道_快手收益来源
Excel Power Pivot如何处理XML数据源 构建高级数据模型
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法
Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议
高德地图公交到站提醒失败如何解决 高德提醒权限设置
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
必由学官方登录入口 必由学教师学生账号快速访问
Pandas DataFrame:高效添加条件计算列
汽水音乐在线版入口_汽水音乐网页播放手册
微信网页版扫码登录入口 微信网页版二维码登录入口
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
动漫花园资源网使用步骤_动漫花园资源网下载流程
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
2025-2030年全球乘用车销量预测:新能源成增长主力
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
学习通在线学习平台 学习通网页版直接进入课程中心
在WordPress中通过REST API获取BasicAuth保护的远程文章
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
邮政快递单号查询入口 邮政快递物流信息在线查询入口
优化大型XML文件解析:基于Python流式处理的内存高效方案
抖音怎么赚钱_抖音创作者变现方法与途径指南
Win11怎么开启省电模式_Win11电池节电模式自动开启
腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
微博网页版官方账号登录 微博网页版内容浏览使用指南
UC浏览器网页版登录入口官网 电脑版网址入口
解决移动端滚动问题的overflow属性应用指南
J*aScript:在map操作中高效处理空数组
动漫岛观看全网网 动漫岛在线正版动漫入口
如何在CSS中使用浮动制作导航栏_float实现水平菜单
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
163邮箱官方主页登录 直达网易邮箱登录核心页面
汽水音乐在线解析 汽水音乐在线解析入口
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
在J*a中如何使用Stream.map转换元素_Stream映射操作解析


2025-11-24
浏览次数:次
返回列表
<pre class='brush:php;toolbar:false;'>periodic_timer(500, 3, []() {
std::cout << "周期任务执行\n";
});
return 0;