1. 程式人生 > >linux下如何實現多個定時器

linux下如何實現多個定時器

最近在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);
}


貼出執行結果: