
实现TaskTimer主要有开始、停止、设置调用函数与参数三个方法。TaskTimer.h1 #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 #endifTaskTimer.cpp1 #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::coutthread createstd::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_seccurrent.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.cppmain函数实现调用。1 #include iostream 2 #include string 3 #include TaskTimer.h 4 5 static void func(void*param){ 6 int * pi (int*)param; 7 std::couthello ! *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 }