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