关于linux下定时器,多定时器

2019-07-13 08:59发布

在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;stimers执行不同的函数

        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;//定时执行的函数这里可以根据需要,执行不同的函数。