新闻中心

C++怎么实现一个计时器(Timer)_C++多线程与高精度时间测量

2025-11-24
浏览次数:
返回列表
使用std::chrono和std::thread可实现高精度跨平台计时器,支持单次与周期性任务。1. 通过steady_clock测量时间间隔;2. 结合sleep_until实现延时执行;3. 封装Timer类管理线程安全的定时任务;4. 多定时任务宜用优先队列统一调度以提升效率。

c++怎么实现一个计时器(timer)_c++多线程与高精度时间测量

在C++中实现一个计时器(Timer),尤其是结合多线程和高精度时间测量时,需要使用现代C++标准库中的 std::chronostd::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::threadstd::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映射操作解析 

搜索