软件定时器的实现方法和系统的制作方法

文档序号:6512947阅读:163来源:国知局
软件定时器的实现方法和系统的制作方法
【专利摘要】本发明实施例公开了一种软件定时器实现方法,采用双数组多队列的方式管理定时器,按照定时器的定时时长以及当前计时时刻确定定时器所属的定时器队列,使得定时器的分布比较均匀,不易出现某个定时器队列过长的现象,而且,在某个计时时刻只扫描两个定时器队列来判断定时器是否达到定时时长,即减少了扫描队列数量,从而提高了定时器的定时效率。本申请实施例还提供一种软件定时器实现系统。
【专利说明】软件定时器的实现方法和系统
【技术领域】
[0001]本发明涉及定时器【技术领域】,更具体地说,涉及一种软件定时器的实现方法和系统。
【背景技术】
[0002]在软件开发过程中,需要用到大量的定时器(即软件定时器),定时器的作用就是控制软件等待某事件发生的时间间隔,具体在实现时,需要检测定时器是否达到定时时长,如果是,则触发相应的事件。目前常见的软件定时器的实现方法有两种:
[0003]一种是单队列实现方法,该方法采用一个队列进行定时器管理控制,即将定时器按定时时长从小到大的顺序进行排列,当增加定时器时,根据定时时长从小到大的原则,插入到当前队列的对应位置,该种方法虽然实现简单,但在海量定时器场景下,定时器节点堆积数量大,定时器的定时效率低,导致定时器达到定时时长时不能及时触发相应事件,使得服务器时延大。为了提高定时器的定时效率,目前提出一种多队列定时器实现方法,该方法将所有的定时器中同一定时精度的定时器分为一组,通过轮询方式检测每一个队列中的定时器是否超时。
[0004]发明人在实现本发明的过程中发现,目前的多队列定时器实现方法,相对于单队列实现方法,虽然效率有所提高,但是,会存在很多冗余遍历定时器的操作,例如,假设有N个队列,那么,当只有一个定时器时,系统还需要去检测其它N-1个队列有没有定时器超时,这样系统就白白耗费了轮询N-1队列的时间,因此,当定时器的数量较大时,定时器的定时效率仍然较低。

【发明内容】

[0005]本发明的目的是提供一种软件定时器实现方法,以进一步提高定时器的定时效率。
[0006]为实现上述目的,本发明提供了如下技术方案:
[0007]一种软件定时器的实现方法,包括:
[0008]预定义循环计时器;
[0009]依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时刻度;
[0010]当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;
[0011]如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;[0012]如果否,获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
[0013]上述方法,优选的,当所述计数器的初始值大于所述商值时,还包括:扫描当前计时时刻下的定时器队列,
[0014]当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;
[0015]当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长;
[0016]其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
[0017]计数器初始值=目标计数值+商值+1。
[0018]上述方法,优选的,当所述计数器的初始值等于所述商值时,还包括:扫描当前计时时刻下的定时器队列,
[0019]当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;
[0020]当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
[0021]上述方法,优选的,当判断出有定时器达到定时时长时,还包括:
[0022]判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器。
[0023]上述方法,优选的,还包括:
[0024]如果所述达到定时时长的定时器不是循环定时器,则将所述达到定时时长的定时器释放并进行缓存。
[0025]上述方法,优选的,对当前计时时刻下的定时器队列进行扫描后,还包括:
[0026]判断是否到达下一计时时刻,如果是,则扫描下一计时时刻下挂载的定时器队列;否则,等待下一计时时刻到达时,再扫描下一计时时刻下挂载的定时器队列。
[0027]上述方法,优选的,所述循环计时器的计时时长依据定时器的定时时长确定。
[0028]一种软件定时器实现系统,包括:
[0029]预定义模块,用于预定义循环计时器;
[0030]初始化模块,用于依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时刻度;[0031]第一定时器增加模块,用于当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时亥|J,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;如果否,则获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
[0032]上述系统,优选的,当所述计数器的初始值大于所述商值时,所述系统还包括:
[0033]第一扫描模块,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长;
[0034]其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
[0035]计数器初始值=目标计数值+商值+1。
[0036]上述系统,优选的,当所述计数器的初始值等于所述商值时,所述系统还包括:
[0037]第二扫描模块,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
[0038]上述系统,优选的,还包括:
[0039]第二定时器增加模块,用于当有定时器达到定时时长时,判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器。
[0040]通过以上方案可知,本申请提供的一种软件定时器实现方法,预先设定两个计时数组,将定时器按定时时长以及预先定义的循环计时器的计时时长挂载在相应的计数器数组中的目的计时时刻下的定时器队列中,且定时器的目的计时时刻依据当前定时时刻以及定时器的定时时长确定,因此,对于第一计时数组中各个计时时刻下挂载的定时器,当循环计时器的计时时刻到达所述目的计时时刻时,就可以判断该目的计时时刻下的定时器达到计时时长,而对于第二计时数组中各个计时时刻下挂载的定时器,当循环计时器的计时时刻到达所述目的计时时刻时,可以结合计数器判断该目的计时时刻下的定时器是否达到定时时长。
[0041]由此可知,本申请实施例提供的一种软件定时器实现方法,采用双数组多队列的方式管理定时器,按照定时器的定时时长以及当前计时时刻确定定时器所属的定时器队列,使得定时器的分布比较均匀,不易出现某个定时器队列过长的现象,而且,在某个计时时刻可以只扫描两个定时器队列来判断定时器是否达到定时时长,减少了扫描队列数量,从而提闻了定时效率。
【专利附图】

【附图说明】
[0042]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0043]图1为本申请实施例提供的一种软件定时器实现方法的流程图;
[0044]图2为本申请实施例提供的扫描当前计时时刻下的定时器队列的流程图;
[0045]图3为本申请实施例提供的另一种扫描当前计时时刻下的定时器队列的流程图;
[0046]图4为本申请实施例提供的一种软件定时器实现系统的结构示意图;
[0047]图5为本申请实施例提供的另一种软件定时器实现系统的结构示意图;
[0048]图6为本申请实施例提供的又一种软件定时器实现系统的结构示意图;
[0049]图7a为本申请实施例提供的又一种软件定时器实现系统的结构示意图;
[0050]图7b为本申请实施例提供的又一种软件定时器实现系统的结构示意图。
[0051]说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三” “第四”等(如果存在)是用于区别类似的部分,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示的以外的顺序实施。
【具体实施方式】
[0052]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0053]请参阅图1,图1为本申请实施例提供的一种软件定时器实现方法的流程图,包括:
[0054]步骤SlOl:预定义循环计时器;
[0055]循环计时器的计时位数η可以自定义,如η的取值可以为16,也可以为22,或其它取值,如15,或32等等,这里不做具体限定。也就是说,循环计时器的各个计时时刻由一个η位的二进制数表示;而循环计时器的计时精度可以根据需要设置的所有定时器中的最小定时精度确定,例如,假设需要设置的所有定时器的精度包括三种:毫秒、秒和分钟,那么,循环计时器的计时精度可以选为毫秒,即循环计时器每I毫秒计时一次,也就是说,循环计时器的各个计时时刻的单位为毫秒。因此,在定义了循环计时器的位数及精度后,循环计时器的计时时长也就确定了,即2n*a,其中,a为计时精度,例如,a=l纳秒,或a=l毫秒,或a=l秒,或a=l分钟等等。
[0056]本实施例中,循环计时器从O开始计时,每I计时精度计时一次,当计时到(2n_l)计时精度时,会跳转到O从头开始计时,例如,假设计时精度为毫秒,那么,循环计时器会每I毫秒计时一次,当计时到(2n-l)毫秒时,跳转到O从头开始计时。
[0057]步骤S102:依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时时刻。
[0058]所述第一计时数组中的各个元素依次为0、1、2、3、……、2n_l,所述第二计时数组与所述第一计时数组相同,因此,第二计时数组中的各个元素也依次为0、1、2、3、……、2n-l。
[0059]步骤S103:当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;如果是,则执行步骤S104 ;否则,执行步骤S105 ;
[0060]判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内,可以通过判断所述待增加的定时器的定时时长是否小于所述循环计时器的计时时长,如果待增加的定时器的定时时长小于或等于所述循环计时器的计时时长,则待增加的定时器的定时时长在所述循环计时器的计时时长范围内,否则,所述待增加的定时器的定时时长不在所述循环计时器的计时时长范围内。
[0061]当然,也可以将待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算,根据商值来判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内,具体的,当所述商值为O时,确定所述待增加的定时器的定时时长在所述循环计时器的计时时长范围内,当所述商值不为零时,确定所述待增加的定时器的定时时长不在所述循环计时器的计时时长范围内。
[0062]步骤S104:依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;
[0063]换句话说,待增加的定时器所对应的目的计时时刻为:以所述循环计时器当前计时时刻为基准,向计时时刻增大的方向偏移所述待增加的定时时长所确定的定时时刻。
[0064]举例说明:假设循环计时器的计时时长为从O晕秒到65535晕秒,即65536晕秒,也就是65536个计时时刻,待增加的定时器的定时时长为60毫秒;
[0065]假设当前循环计时器的计时时刻为10毫秒,那么,该待增加的定时器的目的计时时刻则为70毫秒,即以10毫秒为基准,向计时时刻增大的方向偏移60毫秒;此时,将待增加的定时器挂载在第一计时数组中,与70毫秒对应的兀素下所挂载的定时器队列中。
[0066]假设当前循环计时器的计时时刻为65530毫秒,那么,该待增加的定时器的目的计时时刻则为54毫秒,即以65530毫秒为基准,向计时时刻增大的方向偏移60毫秒,而由于偏移5毫秒时,循环计时器的计时时刻达到了循环计时器的最大计时时刻65535毫秒,此时,循环计时器会跳转到O重新计时,因此,需要从O开始再向计时时刻增大的方向偏移55毫秒,即54毫秒的计时时刻即为待增加的定时器的目的计时时刻。此时,将待增加的定时器挂载在第一计时数组中,54毫秒对应的兀素下所挂载的定时器队列中。
[0067]步骤S105:获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,该计数器可以用来判断定时器是否达到定时时长;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
[0068]也就是说,在待增加的定时器的定时时长大于所述循环计时器的计时时长时,将待增加的定时器加载在第二计时数组中;
[0069]其中,所述计数器的初始值依据所述商值确定,所述初始值可以为所述商值;
[0070]所述计数器的初始值也可以大于所述商值,此时,所有计数器的初始值按照统一的赋值规则进行赋值,例如,预先确定目标计数值,所述计数器的初始值可以按第一公式确定,所述第一公式为:
[0071]计数器的初始值=目标计数值+商值+1。
[0072]需要说明的是,在具体实施过程中,所有定时器所对应的计数器应该都使用同一种初始化方法,即,所有计数器在初始化时,要么初始值都为商值,要么初始值都按照统一的赋值规则进行赋值。
[0073]举例说明:假设循环计时器的计时时长为从O晕秒到65535晕秒,即65536晕秒,共65536个计时时刻,待增加的定时器的定时时长为65538毫秒;
[0074]将待增加的定时器的定时时长与循环计时器的计时时长做除法运算,得到的商值为1,余数为2
[0075]假设当前循环计时器的计时时刻为10毫秒,那么,该待增加的定时器的第二目的计时时刻则为12毫秒,即以10毫秒为基准,向计时时刻增大的方向偏移2毫秒;此时,将待增加的定时器挂载在第二计时数组中,12毫秒对应的元素下所挂载的定时器队列中,同时针对该定时器设置一个计数器,该计数器的初始值根据赋值规则可以为1,或者设置为大于1,例如初始值为2或3等等,只要大于I即可。
[0076]本申请实施例中,两个计时数组中的每个元素都可以对应一个定时器队列,因此,每一个元素都可以看做是一个定时器队列的队列头,所以,本申请实施例是通过双数组多队列的方式对定时器进行管理控制,从而实现了软件定时。
[0077]本申请实施例提供的一种软件定时器实现方法,预先设定两个计时数组,将定时器按定时时长以及预先定义的循环计时器的计时时长挂载在相应的计数器数组中的目的计时时刻所对应的元素下的定时器队列中,且定时器的目的计时时刻依据当前定时时刻以及定时器的定时时长确定,因此,对于第一计时数组中各个计时时刻下挂载的定时器,当循环计时器的计时时刻到达所述第一目的计时时刻时,就可以确定该第一目的计时时刻下的定时器达到计时时长,而对于第二计时数组中各个计时时刻下挂载的定时器,当循环计时器的计时时刻到达所述第二目的计时时刻时,可以结合计数器判断该目的计时时刻下的定时器是否达到定时时长。
[0078]由此可知,本申请实施例提供的一种软件定时器实现方法,采用双数组多队列的方式管理定时器,按照定时器的定时时长以及当前计时时刻确定定时器所属的定时器队列,使得定时器的分布比较均匀,不易出现某个定时器队列过长的现象,而且,在某个计时时刻只扫描两个定时器队列来判断定时器是否达到定时时长,减少了扫描队列数量,从而提高了定时效率,而且,因为定时器节点分分布均匀,不会导致某一队列过长而导致消耗过多的扫描时间,因此,本申请实施例提供的定时器实现方法,不会因为定时器数量的指数增长而使得定时效率呈指数下跌。
[0079]而且,在增加定时器时,直接插入相应队列即可,不用对定时器进行排序,进一步提闻了定时器的定时效率。
[0080]另外,由于,同一时刻只扫描两个队列,因此,冗余扫描少(最多两次冗余扫描),而且,由于第二数组下挂载的定时器设置有与其对应的计数器,也就是说,第二计时数组中的定时器一定有设置有相应的计数器,换句话说,如果当前计时时刻下,第二计时数组中当前计时时刻对应的元素下设置有计数器,则该第二计时数组中当前计时时刻对应的元素下一定挂载有定时器,否则,没有挂载定时器,因此,在进行定时器扫描时,可以根据当前计时时刻下的定时器队列是否设置有计数器来判断是否需要对当前计时时刻下第二数组相应元素下的定时器队列进行扫描,如果设置有定时器,则进行扫描,如果没设置有定时器,则不进行扫描,因此可以避免冗余扫描,可以进一步提高定时器的定时效率。
[0081]进一步的,由于本方案结合使用计数器进行定时,定时时长t较长,其定时时长t为:
[0082]t=2(i+J)*a,
[0083]其中,i为定时器位数,j为计数器位数,a为定时器精度。
[0084]例如,假设定时器位数为16 (short类型),计数器位数为32 (int类型),精度为10毫秒,则定时时长t为:
[0085]t=2(16+32) *0.0I 秒=89255 年。
[0086]上述实施例,优选的,当所述计数器的初始值大于所述商值时,还可以包括:扫描当前计时时刻下的定时器队列的步骤,具体的,所述扫描当前计时时刻下的定时器队列的流程图如图2所示,可以包括:
[0087]步骤S201:当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;
[0088]也就是说,循环计时器每达到一个计时时刻,就对第一计时数组中,该计时时刻下挂载的定时器队列进行扫描,如果该计时时刻下挂载有定时器,则该定时时刻下挂载的定时器达到了定时时长。
[0089]步骤S202:当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,判断当前计时时刻下挂载的定时器达到定时时长;
[0090]其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为:
[0091]计数器的初始值=目标计数值+商值+1。
[0092]也就是说,循环计时器每达到一个计时时刻,除了对第一计时数组中,当前计时时刻下挂载的定时器队列进行扫描,还对第二计时数组中,该计时时刻下挂载的定时器队列进行扫描,当该计时时刻下挂载有定时器队列时,将当前计时时刻下挂载的所有定时器所对应的计数器的计数值减一,如果此时有定时器的计数值为零,则可判断该计数值为零的计数器对应的计时器达到定时时长。
[0093]当判断出定时器达到定时时长时,就可以发送超时信号以触发相应的事件。[0094]其中,步骤S201和步骤S202执行顺序不做具体限定,即在当前扫描周期内,可以先对第一计时数组中当前计时时刻下的定时器队列进行扫描,然后对第二计时数组中当前计时时刻下的定时器队列进行扫描;也可以先对第二计时数组中当前计时时刻下的定时器队列进行扫描,然后对第一计时数组中当前计时时刻下的定时器队列进行扫描;
[0095]上述实施例,优选的,当所述计数器的初始值为所述商值时,本申请实施例提供的另一种扫描当前计时时刻下的定时器队列的流程图如图3所示,可以包括:
[0096]步骤S301:当第一计时数组中的当前计时时刻下挂载有定时器时,判断当前计时时刻下挂载的定时器达到定时时长;
[0097]具体可参见步骤S201,这里不再赘述。
[0098]步骤S302:当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
[0099]本申请实施例中,先扫描第一计时数组中当前计时时刻对应的元素下的定时器队列,再扫描第二计时数组中当前计时时刻对应的元素下的定时器队列,在当前计时时刻下挂载的定时所对应的计数器的计数值为零时,将该计数值为零的计数器对应的定时器从第二计时数组中移除,并挂载在第一计时数组中当前计时时刻下挂载的定时器队列中。
[0100]上述实施例,优选的,当判断出有定时器达到定时时长时,还可以包括:
[0101]判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器;如果否,则将所述达到定时时长的定时器存储到缓存中。
[0102]也就是说,本申请 实施例提供的软件定时器实现方法,可支持的定时器包括一次性定时器和循环定时器;其中,所述一次性定时器是指该定时器达到定时时长后不再进行定时,可以退出定时器队列;所述循环定时器是指该定时器在达到定时时长后,还要再次进行定时。
[0103]此时,可以以当前计时时刻为基准,再增加一个具有相同定时时长的定时器即可。
[0104]如果所述达到定时时长的定时器不是循环定时器,则将该达到定时时长的定时器退出定时器队列,并存储在缓存中,以供下次增加定时器时使用。
[0105]为了优化上述实施例,可以预先设置空闲定时器队列,用于缓存暂时空闲的定时器,以便变需要曾加定时器时可以快速获取空闲定时器。
[0106]上述实施例,优选的,为了保证定时器的精准性,对当前计时时刻下的定时器队列进行扫描后,还可以包括:
[0107]判断是否到达下一计时时刻,如果是,则扫描所述循环计时器的下一计时时刻下挂载的定时器队列;否则,等待下一计时时刻到达时,再扫描下一计时时刻下挂载的定时器队列;
[0108]其中,所述到达下一时刻包括:正好到达下一计时时刻,或者,超过了所述下一计时时刻,例如,假设当前计时时刻为h,下一计时时刻为t2,那么,所述到达下一时刻包括:到达1^计时时刻;或者到达t3时刻,其中,t3>t2。相应的,如果到达下一计时时刻,则不管是到达t2计时时刻,还是到达t3计时时刻,则扫描t2计时时刻对应的计时数组元素下所挂载的定时器队列。如果还未到达t2计时时刻,则进行等待,等到计时时刻到达t2计时时刻时,扫描t2计时时刻对应的计时数组元素下所挂载的定时器队列。
[0109]上述实施例,优选的,所述循环计时器的计时时长可以依据定时器的定时时长确定,例如,可以设置所述循环计时器的计时时长大于或等于最长的定时时长,以保证所有的定时器都挂载在第一计时数组队列中;当然,也可以将大部分定时器挂载在第一计时数组中的定时器队列中,例如,可以将2/3的定时器挂载在第一计时数组中的定时器队列中,将其余1/3定时器挂载在第二计时数组中的定时器队列中,此时,循环计时器的计时时长可以等于所述2/3的定时器可以实现的最长定时时长。
[0110]以下是本发明方法的定时器节点程序实现的一种具体示例:
[0111]定时器节点结构定义:
【权利要求】
1.一种软件定时器的实现方法,其特征在于,包括: 预定义循环计时器; 依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计时器的各个计时刻度; 当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内; 如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长; 如果否,获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
2.根据权利要求1所述的方法,其特征在于,当所述计数器的初始值大于所述商值时,还包括:扫描当前计时时刻下的定时器队列, 当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长; 当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长; 其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为: 计数器初始值=目标计数值+商值+1。
3.根据权利要求1所述的方法,其特征在于,当所述计数器的初始值等于所述商值时,还包括:扫描当前计时时刻下的定时器队列, 当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长; 当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
4.根据权利要求2或3所述的方法,其特征在于,当判断出有定时器达到定时时长时,还包括: 判断所述达到定时时长的定时器是否为循环定时器,如果是,则增加相同定时时长的定时器。
5.根据权利要求4所述的方法,其特征在于,还包括: 如果所述达到定时时长的定时器不是循环定时器,则将所述达到定时时长的定时器释放并进行缓存。
6.根据权利要求2或3所述的方法,其特征在于,对当前计时时刻下的定时器队列进行扫描后,还包括: 判断是否到达下一计时时刻,如果是,则扫描下一计时时刻下挂载的定时器队列;否贝U,等待下一计时时刻到达时,再扫描下一计时时刻下挂载的定时器队列。
7.根据权利要求1所述的方法,其特征在于,所述循环计时器的计时时长依据定时器的定时时长确定。
8.一种软件定时器实现系统,其特征在于,包括: 预定义模块,用于预定义循环计时器; 初始化模块,用于依据所述循环计时器的计时位数,确定第一计时数组和第二计时数组,所述第一计时数组和所述第二计时数组相同,所述第一计时数组和所述第二计时数组的各个元素对应所述循环计 时器的各个计时刻度; 第一定时器增加模块,用于当需要增加定时器时,判断待增加的定时器的定时时长是否在所述循环计时器的计时时长范围内;如果是,则依据所述循环计时器当前的计时时刻与所述待增加的定时器的定时时长确定所述待增加的定时器对应的第一目的计时时刻,并将所述待增加的定时器挂载在所述第一计时数组中的第一目的计时时刻下的定时器队列中;其中,所述第一目的计时时刻与当前计时时刻的差值为所述待增加的定时器的定时时长;如果否,则获取将所述待增加的定时器的定时时长与所述循环计时器的计时时长做除法运算所得到的商值和余数值;依据所述循环计时器当前的计时时刻与所述余数确定所述待增加的定时器对应的第二目的计时时刻,并将所述待增加的定时器挂载在所述第二计时数组中的第二目的计时时刻下的定时器队列中;并设置与所述待增加的定时器相对应的计数器,所述计数器的初始值大于或等于所述商值;其中,所述第二目的计时时刻与当前计时时刻的差值为所述余数值。
9.根据权利要求8所述的系统,其特征在于,当所述计数器的初始值大于所述商值时,所述系统还包括: 第一扫描模块,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为目标计数值时,确定当前计时时刻下挂载的定时器达到定时时长; 其中,所述目标计数值为大于或等于零的整数,所述计数器的初始值依据第一公式确定,所述第一公式为: 计数器初始值=目标计数值+商值+1。
10.根据权利要求8所述的系统,其特征在于,当所述计数器的初始值等于所述商值时,所述系统还包括: 第二扫描模块,用于扫描当前计时时刻下的定时器队列,当第一计时数组中的当前计时时刻下挂载有定时器时,确定当前计时时刻下挂载的定时器达到定时时长;当第二计时数组中的当前计时时刻下挂载有定时器时,将当前计时时刻下挂载的所有定时器所对应的计数器减一,在当前计时时刻下挂载的定时器所对应的计数器计数值为零时,将第二计时数组中当前计时时刻下挂载的定时器移至所述第一计时数组的当前计时时刻下。
【文档编号】G06F9/44GK103473071SQ201310439031
【公开日】2013年12月25日 申请日期:2013年9月24日 优先权日:2013年9月24日
【发明者】李锐明, 黄世华, 钟虎林, 罗均文, 朱敬毅, 甘鸣春, 别业辉 申请人:深圳市路通网络技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1