Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7723117
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2012-10-16 17:12:40

【实现功能】:下的C编程:编写一个程序(库),实现定时器(计时器)的功能,它能为用户提供在同一进程中多次使用的定时器。这里要求用信号来实现。

 

【解题思路】:编写一个结构体Timer代表一个计时器,然后再定义Timer类型的数组myTimer[N],用来保存我们设置的定时器;再定义函数setTimer()生成计时器,并将生成的计时器保存到myTimer中,这样通过多次调用,就可以在同一个进程中生成多个计时器;定义timeout()信号处理函数,每隔一秒产生一个信号,通过调用timeout()对所有的定时器扫描一遍,检查哪些计时器超时。

 

【程序代码】:如下

#include

#include

#include

#include

#include

#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,判断下一步选择哪种操作

           case 1:

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

           case 2:

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

           case 3:

              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);

}

 

阅读(13716) | 评论(2) | 转发(10) |
给主人留下些什么吧!~~

lys53002012-10-18 21:35:43

学习。

Bean_lee2012-10-17 18:45:39

呵呵 Linux下的定时器有点难,写个好的定时器通用的定时器是比较难的。
UNIX系统编程里面有一章讲定时器的