關於linux下定時器,多定時器

cqltbe131421發表於2017-04-18

在windows下,我們可以建立多個定時器,而且也可以刪除,沒個定時器有獨立的id號可以區分,但是在linux下一個執行緒只能有一個定時器,這讓我們需要使用多個定時器任務就顯得有點尷尬了。但是也不是沒有辦法。

下面我們來對比windows下的定時器和linux下的定時器任務

 MMRESULT           timer_handle;
定義一個定時器id;

timer_handle = ::timeSetEvent( UINT uDelay, 
                                 UINT uResolution, 
                                 LPTIMECALLBACK lpTimeProc, 
                                 WORD dwUser, 
                                 UINT fuEvent )

通過timeSetEvent,來初始化一個定時器,

        uDelay:以毫秒指定事件的週期。
         Uresolution:以毫秒指定延時的精度,數值越小定時器事件解析度越高。預設值為1ms。
         LpTimeProc:指向一個回撥函式。
         DwUser:存放使用者提供的回撥資料。
         FuEvent:指定定時器事件型別:
         TIME_ONESHOT:uDelay毫秒後只產生一次事件
         TIME_PERIODIC :每隔uDelay毫秒週期性地產生事件。

::timeKillEvent( timer_handle );通過::timeKillEvent()函式來刪除定時器

使用起來是很方便的。

但是在linux下,有兩種定時器alarm和 struct itimerval   timer_handle;如果要比較精確的話建議使用 struct itimerval   timer_handle;

 struct itimerval   timer_handle;建立定時器

        timer_handle.it_interval.tv_sec=0; //設定單位定時器定時時間到秒
        timer_handle.it_interval.tv_usec=100000;//到微妙
        timer_handle.it_value.tv_sec=0; //設定單位定時器初始值
        timer_handle.it_value.tv_usec=100000;//到微妙
        setitimer(ITIMER_REAL,&timer_handle,NULL); //初始化單位定時器
        signal(SIGALRM,(__sighandler_t)multi_timer_manage); //指定單位定時器定時時間到時執行的multi_timer_manage函式,SIGALRM是訊號型別

下面是刪除定時器:

 struct itimerval value;//這裡定義了一個定時器,其實也就是覆蓋了上一個定時器,設定時間都為0就行了
            value.it_value.tv_sec = 0;
            value.it_value.tv_usec = 0;
            value.it_interval = value.it_value;
            setitimer(ITIMER_REAL, &value, NULL);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

linux下的多定時,其實也是定義一個定時器,然後,根據不同時間發出的訊號來處理不同的事件,

   struct timers//定義一個結構體
   {
   int interval; //定時時間,表示多少時間執行一次
   void(*handler)(int); //處理函式,所要執行的函式
   };

 struct timers timer[10];//然後我們定義十個這樣的結構體

int i=0;//定義一個變數來記錄一下

下面是:訊號處理函式

    void static multi_timer_manage()
    {
       for(int s=0;s<i;s++){//根據不同的timers執行不同的函式
        timer[s].interval--;
        if(timer[s].interval==0)
        {
        timer[s].interval=s+1;
        timer[s].handler(s);
        }
        }
    }

然後,我們在設定

      timer[i].interval=i+1;//時間
      timer[i++].handler=TimeCbProc;//定時執行的函式這裡可以根據需要,執行不同的函式。


相關文章