当前位置: 首页 > news >正文

【C++】实现一个定时器

实现

TaskTimer主要有开始、停止、设置调用函数与参数,三个方法。

  • TaskTimer.h
1 #ifndef _TASKTIMER_H 2 #define _TASKTIMER_H 3 //计时器 实现循环注册 4 #include <iostream> 5 #include <thread> 6 #include <chrono> 7 #include <unistd.h> 8 9 //定时器调用的函数 10 typedef void(*timerFunCallBack)(void * param); 11 12 class TaskTimer{ 13 14 public: 15 TaskTimer(unsigned long second); 16 ~TaskTimer(); 17 18 void start(); 19 void stop(); 20 21 void setTimerFun(timerFunCallBack fun,void* param); 22 static void * timer(void * context); 23 24 private: 25 //回调函数 26 timerFunCallBack m_timerFun; 27 //回调函数参数 28 void * m_funParam; 29 //间隔 30 unsigned long m_timeSecond; 31 bool m_isStop; 32 std::thread m_thread; 33 }; 34 35 #endif
  • TaskTimer.cpp
1 #include "TaskTimer.h" 2 #include <sys/time.h> 3 4 TaskTimer::TaskTimer(unsigned long second):m_timeSecond(second),m_isStop(true){ 5 m_timerFun = nullptr; 6 m_funParam = nullptr; 7 8 } 9 TaskTimer:: ~TaskTimer(){ 10 stop(); 11 } 12 13 void TaskTimer::start(){ 14 //创建线程 15 m_isStop = false; 16 m_thread = std::thread(&TaskTimer::timer,(void*)this); 17 std::cout<<"thread create"<<std::endl; 18 } 19 void TaskTimer::stop(){ 20 m_isStop = true; 21 if(m_thread.joinable()){ 22 m_thread.join(); 23 } 24 } 25 26 void TaskTimer::setTimerFun(timerFunCallBack fun,void* param){ 27 m_timerFun = fun; 28 m_funParam = param; 29 } 30 31 void * TaskTimer::timer(void * taskTimer){ 32 std::cout << "Timer thread function ENTERED!" << std::endl; 33 TaskTimer * pthis = (TaskTimer * )taskTimer; 34 if(nullptr == pthis){ 35 return nullptr; 36 } 37 unsigned long curTime = 0;//当前时间 38 unsigned long lastTime = 0;//上次更新时间时间 39 struct timeval current; 40 while(!pthis->m_isStop){ 41 gettimeofday(&current,nullptr); 42 //换算成毫秒 tv_sec 秒 tv_usec 微妙 43 curTime = current.tv_sec+current.tv_usec/1000000; 44 45 // 处理时间回退情况 46 if (curTime < lastTime) { 47 lastTime = curTime; 48 continue; 49 } 50 51 if((curTime-lastTime) >= (pthis->m_timeSecond)){ 52 lastTime = curTime; 53 if(pthis->m_timerFun != nullptr){ 54 pthis->m_timerFun(pthis->m_funParam); 55 } 56 }else{ 57 usleep(1000*1000); 58 continue; 59 } 60 } 61 return nullptr; 62 }
  • main.cpp

main函数实现调用。

1 #include <iostream> 2 #include <string> 3 #include "TaskTimer.h" 4 5 static void func(void*param){ 6 int * pi = (int*)param; 7 std::cout<<"hello !"<< *pi << std::endl; 8 } 9 10 int main(){ 11 12 //TaskTimer* timer = new TaskTimer(3); 13 TaskTimer timer(1); 14 int param = 123; 15 int * ptr = &param; 16 timer.setTimerFun(func,(void *)ptr); 17 timer.start(); 18 19 usleep(10000*1000); 20 timer.stop(); 21 return 0; 22 }
http://www.jsqmd.com/news/1101746/

相关文章:

  • 从基材到成品:PCB材料制造工艺全流程详解
  • HC-SR501人体红外感应模块:从原理到实战的完整指南
  • 零代码实现卡纳达语手写数字识别:Monk框架实战
  • AI编排实战:MuleSoft与LangChain协同架构设计
  • 系统规划与管理师-矛盾论与实践论在系统规划与管理中的应用
  • AI写代码真能替代程序员?2024最新 benchmark 数据揭示:87%的业务场景已可自动化,但92%团队仍在错误使用
  • 程序员私藏的7个AI提效暗器(未公开文档/内部插件/定制Prompt库):腾讯、字节、微软工程师联合披露
  • GLM-5.1全档位开放:面向生产环境的编程意图理解引擎
  • GB28181协议栈架构设计:构建企业级视频监控平台的高可用解决方案
  • 为什么大厂CTO悄悄停用Copilot?2024最新AI编码工具安全审计报告(含代码泄露风险等级TOP3排名)
  • Windows网络性能测试终极指南:如何用iperf3精准测量你的网络带宽
  • 三步解锁Windows 11性能加速:Win11Debloat系统优化完全指南
  • AI辅助开发效能革命(2024企业级落地白皮书):从GitHub Copilot到自建Code Agent,一线团队真实ROI对比
  • 小程序营销安全实战:从WAF、设备指纹到业务风控的纵深防御体系
  • 【Claude Code生产环境部署白皮书】:已验证的12类真实故障场景与秒级响应SOP
  • GitHub Copilot vs Amazon CodeWhisperer:API响应延迟、上下文理解准确率、IDE兼容性三维度硬核拆解(附测试脚本开源)
  • Win11Debloat:解决Windows系统卡顿的完整开源工具方案
  • 从VS Code到JetBrains,6款主流IDE中AI插件响应延迟实测对比:毫秒级差异如何影响每日编码效率?
  • Spring Boot AOP 性能调优实战
  • Typora只读模式下的代码块粘贴困境:3个维度解析权限系统的精细化管理
  • 第6章 学会在 Linux 中“行走“
  • Pearcleaner:macOS终极清理神器,3步彻底释放磁盘空间
  • 解锁显卡隐藏性能:NVIDIA Profile Inspector完全攻略手册
  • 【AI代码生成安全白皮书】:实测12款主流工具的隐私泄露风险,3家大厂已因API调用触发GDPR审计
  • Win11Debloat终极指南:3步彻底清理Windows 11系统垃圾,释放60%性能潜力
  • 前情提要线上跑的代码找不到源码了,项目又需要调整某个字段的校验规则,早有耳闻知道可以通过Arthas完成这个场景的需求,实际动手试了试,在此记录一下。警告!警告!
  • 从Copilot到CodeGen Pro,AI自动写代码的4个认知断层,90%开发者卡在第2层而浑然不知
  • 想选简约时尚款轨道不用愁 这份实用选购推荐帮你轻松避坑
  • Windows 11安卓子系统终极指南:如何在电脑上免费运行安卓应用
  • Minikube windows安装