linux下如何實現多個定時器
阿新 • • 發佈:2018-12-31
最近在linux下寫一個庫,是給別人用的,要用到定時器這個功能,而且是多定時器任務的,在windows下實現是很方便的,但是
在linux下就遇到了問題,linux下一個程序只能有一個定時器,如果我用了定時器去實現我的任務,那肯定是沒問題的,如果用我庫的人自己也建立了一個定時器,
那麼問題就出現了,我的定時器就被覆蓋了。
我的功能肯定也受到了影響,所以linux下的定時器是需要解決的。
沒辦法,我就自己寫了一個定時器類似功能的程式碼:
#ifndef CTIMER_H #define CTIMER_H #include<pthread.h> #include <unistd.h> #include <signal.h> #include<pthread.h> #include <time.h> #include <sys/time.h> #include <iostream> #include <stdio.h> #include <stdlib.h> #include <list> #include <mutex> using namespace std; #define N 100 //設定最大的定時器個數 typedef void (* Callback )( void *n_obj, void *user_data );//callback struct Timer //Timer結構體,用來儲存一個定時器的資訊 { void *user_data;//回撥函式引數 void *user_obj;//回撥函式引數 int microsecond_time; //每隔total_time秒 int second_time; //還剩left_time秒 int cont_time;//記錄時間 int func; //該定時器超時,要執行的程式碼的標誌 Callback n_cb;//回撥函式指標 }; //定義Timer型別的陣列,用來儲存所有的定時器 class CTimer { public: CTimer(); virtual~CTimer(); void addTimer(int ,int,Callback,void *,void*); //新建一個計時器 static void timeout(); //判斷定時器是否超時,以及超時時所要執行的動作 void start(); void stop(); private: }; #endif // CTIMER_H 下面是cpp;
#include "ctimer.h" #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include <sys/types.h> #include <sys/time.h> #include <iostream> std::list<void*>m_node_list; int is=0,tb=1; //i代表定時器的個數;t表示時間,逐秒遞增 bool statues=true;//狀態資訊 std::mutex m_locker;//鎖 void CTimer::addTimer(int m_time,int sec_time,Callback p,void* parm1,void *parm2 ) //新建一個計時器 { struct Timer *a=new Timer; a->microsecond_time=m_time; a->second_time=sec_time; a->cont_time=sec_time; a->n_cb=p;//huidiao a->user_obj=parm1; a->user_data=parm2; m_node_list.push_back( ( void *)( a )); } CTimer::CTimer(){ } CTimer::~CTimer(){} void CTimer:: timeout()//判斷定時器是否超時,以及超時時所要執行的動作 { std::list<void*>::iterator it;Timer *n; for ( it = m_node_list.begin( ); it != m_node_list.end( ); it ++ ) { if ( *it != 0 ) { n = ( Timer *)( *it ); n->cont_time--; if(n->cont_time==0) { n->cont_time=n->second_time;//重新設定時間 (*n->n_cb )(n->user_data, n->user_obj );//執行回撥 } } } } void CTimer::stop(){ m_locker.lock(); statues=false; m_locker.unlock(); } void* singlesa(void*p){ signal(SIGUSR1,(__sighandler_t)static_cast<CTimer*>(p)->timeout); //接到SIGALRM訊號,則執行timeout函式 while(1) { sleep(1); //每隔一秒傳送一個SIGALRM kill(getpid(),SIGUSR1);//SIGUSR1是使用者自定義訊號。利用kill來發送訊號
if(!statues){break;}
}
}
void CTimer::start(){
pthread_t thread_timer;//建立一個執行緒去傳送訊號
pthread_create(&thread_timer, NULL, singlesa,static_cast<void*>(this));
}
//////////////////////////public methods//////////////////////////
下面是main.cpp 測試一下
void UserCallback( void *obj, void *pa ) { printf(" UserCallback:: ( obj = 0x%x ) T_ID=%u\n", obj, pthread_self()); } int main() //測試函式,定義三個定時器 { CTimer ab; ab.addTimer(1,1,&UserCallback,( void *)0x11,0); ab.start(); getchar(); ab.stop(); getchar(); exit(0); }
貼出執行結果: