懂视

iec定时器

2024-12-08 06:05:04

#ifndefCTimer_hpp#defineCTimer_hpp#includestdio.h#includefunctional#includechrono#includethread#includeatomic#includemutex#includestring#includecondition_variableclassCTimer{public:CTimer(conststd::stringsTimerName="");//构造定时器,附带名称~CTimer();/**开始运行定时器@parammsTime延迟运行(单位ms)@paramtask任务函数接口@parambLoop是否循环(默认执行1次)@paramasync是否异步(默认异步)@returntrue:已准备执行,否则失败*/boolStart(unsignedintmsTime,std::functionvoid()task,boolbLoop=false,boolasync=true);/**取消定时器,同步定时器无法取消(若任务代码已执行则取消无效)*/voidCancel();/**同步执行一次#这个接口感觉作用不大,暂时现实在这里@parammsTime延迟时间(ms)@paramfun函数接口或lambda代码块@paramargs参数@returntrue:已准备执行,否则失败*/templatetypenamecallable,typename...argumentsboolSyncOnce(intmsTime,callablefun,arguments...args){std::functiontypenamestd::result_ofcallable(arguments...)::type()task(std::bind(std::forwardcallable(fun),std::forwardarguments(args)...));//绑定任务函数或lambda成functionreturnStart(msTime,task,false,false);}/**异步执行一次任务@parammsTime延迟及间隔时间@paramfun函数接口或lambda代码块@paramargs参数@returntrue:已准备执行,否则失败*/templatetypenamecallable,typename...argumentsboolAsyncOnce(intmsTime,callablefun,arguments...args){std::functiontypenamestd::result_ofcallable(arguments...)::type()task(std::bind(std::forwardcallable(fun),std::forwardarguments(args)...));returnStart(msTime,task,false);}/**异步执行一次任务(默认延迟1毫秒后执行)@paramfun函数接口或lambda代码块@paramargs参数@returntrue:已准备执行,否则失败*/templatetypenamecallable,typename...argumentsboolAsyncOnce(callablefun,arguments...args){std::functiontypenamestd::result_ofcallable(arguments...)::type()task(std::bind(std::forwardcallable(fun),std::forwardarguments(args)...));returnStart(1,task,false);}/**异步循环执行任务@parammsTime延迟及间隔时间@paramfun函数接口或lambda代码块@paramargs参数@returntrue:已准备执行,否则失败*/templatetypenamecallable,typename...argumentsboolAsyncLoop(intmsTime,callablefun,arguments...args){std::functiontypenamestd::result_ofcallable(arguments...)::type()task(std::bind(std::forwardcallable(fun),std::forwardarguments(args)...));returnStart(msTime,task,true);}private:voidDeleteThread();//删除任务线程public:intm_nCount=0;//循环次数private:std::stringm_sName;//定时器名称std::atomic_boolm_bExpired;//装载的任务是否已经过期std::atomic_boolm_bTryExpired;//装备让已装载的任务过期(标记)std::atomic_boolm_bLoop;//是否循环std::thread*m_Thread=nullptr;std::mutexm_ThreadLock;std::condition_variable_anym_ThreadCon;};