首页 理论教育 定时器超时处理及实现步骤

定时器超时处理及实现步骤

时间:2023-10-21 理论教育 版权反馈
【摘要】:当前情况下,定时器超时处理是在时钟中断中完成的。然后再从定时器队列中提取下一个定时器对象,并转到步骤1进行循环处理。如果相同,说明该定时器已经超时,然后进一步处理;如果不相同,则说明超时的定时器对象已经处理完毕,这时候需要跳出循环。

定时器超时处理及实现步骤

当前情况下,定时器超时处理是在时钟中断中完成的。每次时钟中断发生后,中断处理程序被调用,在中断处理程序中,会比较dwClockTickCounter和dwNextTimerTick两个变量,如果这两个变量相同,则说明当前至少有一个定时器对象超时,这时候,时钟中断处理程序会进行如下操作(是一个循环操作):

(1)从定时器对象队列(lpTimerQueue)中提取第一个定时器对象(定时器对象已经按照超时先后进行排序,排在最前面的定时器对象是最先超时的定时器);

(2)获取定时器对象的超时时刻(即定时器对象在优先队列中的优先级,参考8.7.1节),然后与当前dwNextTimerTick比较,如果不等于dwNextTimerTick,则跳出当前循环,如果等于dwNextTimerTick,则说明该定时器对象超时,于是执行下列操作:

判断回调函数(DirectHandler)是否为空,如果不为空,则以lpHandlerParam为参数调用该回调函数)。

如果为空,则给设置该定时器对象的线程发送一个消息(KERNEL_MESSAGE_TIMER)。

(3)完成上述超时处理后,再判断当前定时器对象是一次定时器,还是永久定时器,如果是一次定时器,则删除该定时器对象,如果是永久定时器,则重新更新该定时器的超时时间,并重新插入定时器对象队列(其插入优先级的确定方式与SetTimer函数操作相同)。(www.xing528.com)

(4)然后再从定时器队列中提取下一个定时器对象,并转到步骤1进行循环处理。

当定时器对象的超时时刻(以tick计)不等于dwNextTimerTick时,上述循环结束,这时候当前定时器对象将是目前所有的定时器对象中最先超时的定时器对象,因此,需要根据该定时器的超时时刻重新计算dwNextTimerTick的值,并更新dwNextTimerTick,然后把该定时器对象重新插入定时器对象队列(因为该定时器对象虽然已被从定时器队列中提取出来,但由于没有超时,所以没有被处理,需要重新插入定时器对象队列,等待下一个超时时刻)。下面是定时器对象的处理代码:

上面的处理是一个循环操作,从定时器队列中提取第一个定时器对象,计算定时器对象的超时时刻(以tick计,超时时刻等于MAX_DWORD_VALUE减去定时器对象在优先队列中的优先级,请参考8.7.1节),并判断提取的定时器对象的超时时刻是否与dwNextTimerTick相同。如果相同,说明该定时器已经超时,然后进一步处理;如果不相同,则说明超时的定时器对象已经处理完毕(只要优先队列中,队头对象没有超时,后边的对象肯定不会超时,因为定时器对象是按照超时先后顺序插入优先队列的),这时候需要跳出循环。

下面的代码,更新了下一个超时时刻(dwNextTimerTick),并把当前定时器对象重新插入定时器对象队列。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈