0

0

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

穿越時空

穿越時空

发布时间:2025-11-24 09:45:36

|

977人浏览过

|

来源于php中文网

原创

使用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 的别名。

示例:测量代码执行时间

立即学习C++免费学习笔记(深入)”;

#include 
#include 

int main() { auto start = std::chrono::steady_clock::now();

// 模拟耗时操作
for (int i = 0; i zuojiankuohaophpcn 1000000; ++i) {
    // do nothing
}

auto end = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_castzuojiankuohaophpcnstd::chrono::microsecondsyoujiankuohaophpcn(end - start);

std::cout zuojiankuohaophpcnzuojiankuohaophpcn "耗时: " zuojiankuohaophpcnzuojiankuohaophpcn duration.count() zuojiankuohaophpcnzuojiankuohaophpcn " 微秒\n";
return 0;

}

2. 实现单次/周期性定时任务(Timer)

可以利用 std::threadstd::this_thread::sleep_until 来实现一个简单的定时器。

目标:在指定时间后执行函数,或周期性执行。

BibiGPT-哔哔终结者
BibiGPT-哔哔终结者

B站视频总结器-一键总结 音视频内容

下载
#include 
#include 
#include 
#include 

void simple_timer(int delay_ms, std::function task) { auto wake_time = std::chrono::steady_clock::now() + std::chrono::milliseconds(delay_ms); std::this_thread::sleep_until(wake_time); task(); }

// 周期性执行 void periodic_timer(int interval_ms, int times, std::function 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); } }

调用示例:

int main() {
    simple_timer(1000, []() {
        std::cout << "1秒后执行\n";
    });
periodic_timer(500, 3, []() {
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn "周期任务执行\n";
});

return 0;

}

3. 多线程安全的 Timer 类设计

如果要支持多个定时任务并行运行,应将每个定时器放在独立线程中,避免阻塞主线程。

class Timer {
public:
    Timer() : running(false) {}
~Timer() {
    stop();
}

void start_once(int delay_ms, std::functionzuojiankuohaophpcnvoid()youjiankuohaophpcn 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::functionzuojiankuohaophpcnvoid()youjiankuohaophpcn 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";
    });
std::this_thread::sleep_for(std::chrono::seconds(2));

timer.start_periodic(300, []() {
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn "每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 不复杂,关键是选对时钟和线程控制方式。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

479

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

60

2025.12.01

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

78

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

46

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

121

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

12

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

15

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 11.4万人学习

C# 教程
C# 教程

共94课时 | 6.5万人学习

C 教程
C 教程

共75课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号