news 2026/4/18 8:52:03

用惯了QTimer定时器,如何快速在纯 C++ 项目中替换?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用惯了QTimer定时器,如何快速在纯 C++ 项目中替换?

是否在使用 Qt 开发时,习惯了 Qt 提供的QTimer类?QTimer简单易用,可以让你轻松地在定时任务中设置时间间隔并执行回调函数。可是,当你突然需要在没有 Qt 环境的纯 C++ 项目中进行开发时,你会发现没有了QTimer,该怎么办呢?

为什么要替换QTimer

在 Qt 中,QTimer是一个非常方便的工具,它的主要作用是周期性地执行某个任务。举个例子,QTimer允许你在固定时间间隔内自动执行回调函数,无需手动管理线程或等待。不过,如果你的项目不是基于 Qt 的话,如何在纯 C++ 环境下实现类似的功能呢?

通常,QTimer依赖 Qt 的事件循环机制,但是纯 C++ 中并没有这个机制。所以我们需要手动管理定时器的启动、停止和回调函数的执行。

如何在纯 C++ 中实现定时器?

在纯 C++ 中,我们可以使用C++11标准中的<chrono><thread>库来实现类似的定时器功能。<chrono>负责时间间隔的控制,<thread>负责执行定时任务的线程管理。通过这两个库,我们就能实现一个高效且简洁的定时器。

实现思路

  1. 使用std::thread启动一个线程,这个线程负责等待指定的时间间隔。
  2. 使用std::atomic来确保线程安全,控制定时器是否正在运行。
  3. 定时任务:在时间间隔到达时执行指定的回调函数。

纯 C++ 实现定时器类

1. 定时器头文件Timer.h

#ifndefTIMER_H#defineTIMER_H#include<functional>#include<thread>#include<atomic>#include<chrono>// 定时器类声明classTimer{public:Timer();// 构造函数~Timer();// 析构函数,确保线程正确停止// 启动定时器voidstart(intinterval,std::function<void()>callback);// 停止定时器voidstop();private:// 定时器线程运行的函数voidrun(intinterval,std::function<void()>callback);// 控制定时器是否运行的标志std::atomic<bool>isRunning;// 定时器线程std::thread timerThread;};#endif// TIMER_H

2. 定时器实现文件Timer.cpp

#include"Timer.h"#include<iostream>#include<thread>#include<chrono>// 构造函数,初始化定时器为停止状态Timer::Timer():isRunning(false){}// 析构函数,确保线程结束Timer::~Timer(){stop();}// 启动定时器voidTimer::start(intinterval,std::function<void()>callback){if(isRunning.load()){return;// 如果定时器已经在运行,不再启动}isRunning.store(true);// 设置定时器为运行状态timerThread=std::thread(&Timer::run,this,interval,callback);}// 停止定时器voidTimer::stop(){if(isRunning.load()){isRunning.store(false);// 停止定时器if(timerThread.joinable()){timerThread.join();// 等待线程结束}}}// 定时器线程运行的实际函数voidTimer::run(intinterval,std::function<void()>callback){while(isRunning.load()){std::this_thread::sleep_for(std::chrono::milliseconds(interval));// 暂停指定时间callback();// 执行回调函数}}

3. 测试代码main.cpp

#include<iostream>#include"Timer.h"// 定时器触发时的回调函数voidtimerCallback(){std::cout<<"Timer triggered!"<<std::endl;}intmain(){Timer timer;// 启动定时器,每2秒触发一次timer.start(2000,timerCallback);// 运行定时器5秒后停止std::this_thread::sleep_for(std::chrono::seconds(5));// 停止定时器timer.stop();return0;}

代码解释

  1. Timer

    • start():启动定时器,设置时间间隔(单位是毫秒),并传入回调函数。
    • stop():停止定时器,防止定时器线程继续运行。
    • run():定时器的实际工作函数,它会在一个单独的线程中运行,周期性地等待指定的时间间隔,然后执行回调函数。
  2. 回调函数timerCallback()是每次定时器到达设定的时间间隔时调用的函数,你可以根据需要更改为其他函数。

  3. 主函数:创建一个Timer对象,启动定时器,每2秒触发一次回调,运行5秒后停止定时器。

为什么要替换成这种方式?

1. 跨平台支持

我们不依赖于 Qt 等大型框架,而是使用标准的 C++ 库实现定时器。这样一来,这个定时器类可以在任何支持 C++11 或更高版本的编译器上运行,适用于跨平台的纯 C++ 项目。

2. 简单高效

通过std::threadstd::chrono,我们实现了一个高效且简单的定时器,不需要额外引入其他第三方库,代码量小且易于理解。

3. 灵活控制

相比 Qt 的事件循环机制,我们使用线程和atomic来实现定时器的启动和停止,给我们提供了更多的控制和灵活性,避免了事件循环的复杂性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 18:11:31

青核桃脱皮机的设计与仿真

青核桃脱皮机的设计与仿真 第一章 绪论 青核桃脱皮是核桃加工产业链中的关键环节&#xff0c;传统人工脱皮方式效率低下、劳动强度大&#xff0c;且易造成果皮残留与果实损伤&#xff0c;难以满足规模化生产需求。现有机械脱皮设备多存在脱皮不彻底、果肉破损率高、适应性差等问…

作者头像 李华
网站建设 2026/4/16 23:25:33

基于PLC设计数控铣床的控制系统

基于PLC设计数控铣床的控制系统 第一章 绪论 传统数控铣床多采用专用数控系统&#xff0c;存在硬件封闭、扩展难度大、维护成本高、适配中小批量加工场景灵活性不足等问题&#xff0c;难以满足中小企业个性化加工、低成本运维的需求。PLC&#xff08;可编程逻辑控制器&#x…

作者头像 李华
网站建设 2026/3/26 7:56:19

专科生收藏!千笔,最受欢迎的AI论文软件

你是否曾为论文选题发愁&#xff0c;绞尽脑汁也找不到方向&#xff1f;是否在深夜里面对空白文档&#xff0c;思绪枯竭、无从下笔&#xff1f;又或者反复修改却始终不满意表达效果&#xff1f;专科生的论文之路&#xff0c;从来都不轻松。但如今&#xff0c;有了千笔AI&#xf…

作者头像 李华
网站建设 2026/4/17 21:08:31

必读:山东菏泽测试团队的全球化远程协作宪章

全球化测试协作的新范式 在数字化浪潮下&#xff0c;山东菏泽测试团队作为全球软件交付链的关键节点&#xff0c;面临跨时区、跨文化协作的复杂挑战。远程协作已非可选项&#xff0c;而是提升测试效率、保障质量的战略核心。传统测试模式在分布式环境中常遭遇沟通失真、环境不…

作者头像 李华
网站建设 2026/4/18 0:03:57

区块链存证技术原理与软件测试的契合性

区块链通过分布式账本和密码学机制&#xff0c;为代码贡献值提供不可篡改的存证基础。其核心包括哈希算法生成唯一数据指纹&#xff08;如SHA-256&#xff09;&#xff0c;确保即使微小改动也会导致哈希值剧变&#xff0c;从而保障数据完整性。结合共识机制&#xff08;如工作量…

作者头像 李华
网站建设 2026/3/21 9:34:21

原圈科技揭秘2026年AI营销趋势:不懂这5大策略系统将落后

原圈科技在AI营销领域&#xff0c;凭借其一体化智慧营销中枢而备受关注。面对创意生成、广告投放、电商增长等碎片化工具的局限&#xff0c;原圈科技的解决方案被普遍视为能够打通营销全链路的理想选择。本文将深度盘点五大主流AI营销系统&#xff0c;助您理解从点状工具到系统…

作者头像 李华