1. 程式人生 > >c語言寫的定時器

c語言寫的定時器

【實現功能】:下的C程式設計:編寫一個程式(庫),實現定時器(計時器)的功能,它能為使用者提供在同一程序中多次使用的定時器。這裡要求用訊號來實現。

【解題思路】:編寫一個結構體Timer代表一個計時器,然後再定義Timer型別的陣列myTimer[N],用來儲存我們設定的定時器;再定義函式setTimer()生成計時器,並將生成的計時器儲存到myTimer中,這樣通過多次呼叫,就可以在同一個程序中生成多個計時器;定義timeout()訊號處理函式,每隔一秒產生一個訊號,通過呼叫timeout()對所有的定時器掃描一遍,檢查哪些計時器超時。

【程式程式碼】:如下

#include<stdlib.h>

#include<unistd.h>

#include<signal.h>

#include<time.h>

#include<sys/time.h>

#define N 100 //設定最大的定時器個數

int i=0,t=1;//i代表定時器的個數;t表示時間,逐秒遞增

struct Timer //Timer結構體,用來儲存一個定時器的資訊

{

int total_time;//每隔total_time

int left_time;//還剩left_time

int func;//該定時器超時,要執行的程式碼的標誌

}myTimer[N];//定義Timer型別的陣列,用來儲存所有的定時器

void setTimer(int t,int f)//新建一個計時器

{

struct Timer a;

a.total_time=t;

a.left_time=t;

a.func=f;

myTimer[i++]=a;

}

void timeout()//判斷定時器是否超時,以及超時時所要執行的動作

{

printf("Time: %d\n",t++);

int j;

for(j=0;j<i;j++)

{

if(myTimer[j].left_time!=0)

myTimer[j].left_time--;

else

{

switch(myTimer[j].func)

{//通過匹配myTimer[j].func

,判斷下一步選擇哪種操作

case1:

printf("------Timer 1: --Hello Aillo!\n");break;

case2:

printf("------Timer 2: --Hello Jackie!\n");break;

case3:

printf("------Timer 3: --Hello PiPi!\n");break;

}

myTimer[j].left_time=myTimer[j].total_time;//迴圈計時

}

}

}

int main()//測試函式,定義三個定時器

{

setTimer(3,1);

setTimer(4,2);

setTimer(5,3);

signal(SIGALRM,timeout);//接到SIGALRM訊號,則執行timeout函式

while(1)

{

sleep(1);//每隔一秒傳送一個SIGALRM

kill(getpid(),SIGALRM);

}

exit(0);

}