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

本文对比了Windows和Linux下的定时器实现方式。Windows支持多个独立ID的定时器,而Linux一个线程仅能拥有一个定时器。文章详细介绍了Windows下的`timeSetEvent`和`timeKillEvent`函数,以及Linux下的`setitimer`和`signal`函数,并提出了一种在Linux中通过信号处理函数实现多定时任务的方法。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vqt5_qt6

你的鼓励是我们创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值