CN104391732A - 软件多定时器动态管理方法 - Google Patents
软件多定时器动态管理方法 Download PDFInfo
- Publication number
- CN104391732A CN104391732A CN201410668924.9A CN201410668924A CN104391732A CN 104391732 A CN104391732 A CN 104391732A CN 201410668924 A CN201410668924 A CN 201410668924A CN 104391732 A CN104391732 A CN 104391732A
- Authority
- CN
- China
- Prior art keywords
- timer
- queue
- node
- timerqueue
- stored
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Executing Machine-Instructions (AREA)
- Communication Control (AREA)
Abstract
本发明提供了一种软件多定时器动态管理方法,首先,定义数据结构,存储定时器标识和定时器超时处理方法;然后,定义队列,存储多定时器信息,每打开一个定时器,将此定时器的标识和处理方法放到队列中;每关闭一个定时器,就将此定时器的标识和处理方法从队列中删除;开启定时器,将定时器信息加入队列;从队列中取出一个节点,判断节点中存储的定时器标识是否与当前超时的定时器标识相同,若相同则该节点对应的定时器超时,按照节点中对应的处理方法处理;否则,判断是否已经取出所有节点,若是,则结束操作;否则,重新提取节点判断。本发明减少了多定时器动态开启关闭时对未开启定时器的非必要查询,减少了CPU开销,提高了***运行速度。
Description
技术领域
本发明涉及计算机领域,具体地,涉及一种软件多定时器动态管理方法。
背景技术
定时器,从字面理解,就是一个时钟,在设定了定时时间之后,经历了设定的时间之后,就会通知设置定时器的人员,时间已经到了,可以进行下一步工作了,在日常生活中,我们经常能接触到定时器,例如,半自动洗衣机中就有定时器,从开始洗衣,旋动定时旋钮,定时器就开启,到定时旋钮回到0,定时器时间到,洗衣结束,可以进行下一步放掉脏水等工作了。我们这里讲的定时器是在做计算机软件编程时,使用到的一种软件定时器,计算机软件逻辑也经常会出现需要设定一个或多个时间,在时间到了之后开始做下一步工作。例如全自动洗衣机,里面有一个计算机控制板,这个计算机控制板中运行的计算机软件就有我们所说的定时器,软件会自动设置定时器,开始第一步工作,在定时器时间到了之后在设置定时器开始第二步工作等。
在嵌入式***中,使用Microsoft Visual C++编写软件代码同时对多个通信节点进行通信超时监视时,经常会使用到定时器,一般定时器的使用方法是使用SetTimer(UINTnIDEvent,UINT nElapse,void(CALLBACK EXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD))函数,第一个参数表示设置的定时器的标识,在定时器响应函数中做定时器超时的处理。一般需要首先判断当前超时的定时器是否是等待需要处理的定时器,如果是,则处理,如果不是则不处理。
如图1所示,在Microsoft Visual C++中,常用的定时器方案为,使用SetTimer(UINTnIDEvent,UINT nElapse,void(CALLBACK EXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD))函数设置定时器,一般指定定时器的标识,在时间响应函数OnTimer(UINTnIDEvent)中,判断当前超时的定时器是否为设置的定时器,即OnTimer(UINT nIDEvent)中nIDEvent是否等于SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT*lpfnTimer)中的nIDEvent。如果相同则处理。如果当前定时器需要关闭,则调用函数KillTimer(int nIDEvent)关闭定时器标识为nIDEvent的定时器,所以在定时器开启时,必须记录开启的定时器标识nIDEvent,在后面关闭定时器时用。这种做法的缺点是:所能设的定时器不能太多,否则,当一个线程的定时器过多时,需要在定时器处理函数中做大量的判断,判断当前是哪一个定时器超时,这种判断所带来的CPU开销在资源有限的嵌入式***中是非常可观的,而且这种做法只能设置预先规定好定时器标识符的定时器,对于数量随时变化,各个定时器的开启和关闭也随时变化的情况,这种做法就非常难以实现。
常用定时器的语句举例如下:
SetTimer(101,300,NULL);
设置定时器标识为101的定时器,定时时间为300毫秒。
SetTimer(200,50,NULL);
设置定时器标识为200的定时器,定时时间为50毫秒。
本例程当前时刻开启了两个定时器,但本例程中,假设可能用到100个定时器。则一般定时器响应函数如下:
上面描述的使用定时器的方案举例中,有100个定时器,则需在OnTimer(UINTnIDEvent)函数中判断当前是哪一个定时器时间到了,而且,定时器越多,则需要判断的次数可能就越多,如果当前时间超时的定时器为定时器200,则在OnTimer(UINTnIDEvent)函数中,需要判断100次才能判断出当前的定时器。而且,如果当前最短的定时时间为50ms,则50ms之内,计算机至少要进入OnTimer(UINT nIDEvent)函数一次,做100次判断,CPU的开销很大。
本发明要解决在使用Microsoft Visual C++开发软件过程中,多定时器情况下,定时器数量可变,各个定时器开启关闭状态也随时变化时,造成的定时器难以管理,CPU开销大的问题。
发明内容
针对现有技术中的缺陷,本发明的目的是提供一种软件多定时器动态管理方法。
根据本发明的一个方面,提供一种软件多定时器动态管理方法,包括以下步骤:
步骤1:定义数据结构TimerData,存储定时器标识TimerID和定时器超时处理方法TimerFun;
步骤2:定义队列TimerQueue,存储多定时器信息,该队列的节点的数据结构形式为TimerData,每打开一个定时器,将此定时器的标识和处理方法放到队列中,队列的节点数加1,;每关闭一个定时器,就将此定时器的标识和处理方法从队列中删除,队列的节点数减1;
步骤3:开启定时器,将定时器信息加入队列;
步骤4:从队列中取出一个节点,判断节点中存储的定时器标识是否与当前超时的定时器标识相同,若相同则执行步骤5,否则,若不同,则执行步骤6;
步骤5:节点中存储的定时器标识与当前超时的定时器标识相同,该节点对应的定时器超时,按照节点中对应的处理方法处理;
步骤6:判断是否已经取出所有节点,若是,则结束操作;否则,重复步骤4。
优选地,步骤2中,队列TimerQueue中定义TimerQueue[n]表示TimerQueue的第N个节点;TimerQueue[n].TimerID表示TimerQueue的第N个节点中存储的定时器标识;TimerQueue[n].TimerFun表示TimerQueue的第N个节点中存储的定时器超时处理方法。
优选地,步骤4通过定时器响应函数判断节点中存储的定时器标识是否与当前超时的定时器标识相同,具体为:在定时器响应函数中,依次找出队列中所有的定时器标识TimerQueue[n].TimerID,与当前定时器响应函数中的定时器标识nID相比较,如果相同,则当前为TimerQueue[n].TimerID所对应的定时器超时。
与现有技术相比,本发明具有如下的有益效果:本发明通过使用队列记录当前开启的定时器标识和定时器处理方法来避开传统的静态查询的方式,减少在多定时器动态开启关闭时对未开启定时器的非必要查询,减少了CPU开销,提高了***的运行速度。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1为常规多定时器响应流程图;
图2为本发明软件多定时器动态管理方法流程原理图。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进。这些都属于本发明的保护范围。
一种软件多定时器动态管理方法,包括以下步骤:
步骤1:定义数据结构TimerData,存储定时器标识TimerID和定时器超时处理方法TimerFun。
步骤2:定义队列TimerQueue,存储多定时器信息,该队列的节点的数据结构形式为TimerData,每打开一个定时器,将此定时器的标识和处理方法放到队列中,队列的节点数加1,;每关闭一个定时器,就将此定时器的标识和处理方法从队列中删除,队列的节点数减1。
队列刚定义时应该是一个空的队列,即节点数为0。进一步地,定义TimerQueue[n]表示TimerQueue的第N个节点,TimerQueue[n].TimerID表示TimerQueue的第N个节点中存储的定时器标识,TimerQueue[n].TimerFun表示TimerQueue的第N个节点中存储的定时器超时处理方法。
步骤3:开启定时器,将定时器信息加入队列。
步骤4:从队列中取出一个节点,判断节点中存储的定时器标识是否与当前超时的定时器标识相同,若相同则执行步骤5,否则,若不同,则执行步骤6。
步骤5:节点中存储的定时器标识与当前超时的定时器标识相同,该节点对应的定时器超时,按照节点中对应的处理方法处理。
具体地,步骤4中通过定时器响应函数判断节点中存储的定时器标识是否与当前超时的定时器标识相同,在定时器响应函数中,依次找出队列中所有的定时器标识TimerQueue[n].TimerID,与当前定时器响应函数中的定时器标识nID相比较,如果相同,则说明当前为TimerQueue[n].TimerID所对应的定时器超时,则步骤5中使用对应的处理方法TimerQueue[n].Fun处理。
步骤6:判断是否已经取出所有节点,若是,则结束操作;否则,重复步骤4。
在本发明的一个较佳实施例中,最多可能使用到64个定时器,每个定时器的定时时间有100ms,300ms,500ms三种,本实例的大部分时间只开启一个定时器,而且,每个定时器的处理方法都不尽相同,采用本发明的方案,大部分时间,定时器响应函数中,每次只需判断一次就能完成相应处理了,相比传统的定时器处理方法,速度提高了很多。
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变形或修改,这并不影响本发明的实质内容。
Claims (3)
1.一种软件多定时器动态管理方法,其特征在于,包括以下步骤:
步骤1:定义数据结构TimerData,存储定时器标识TimerID和定时器超时处理方法TimerFun;
步骤2:定义队列TimerQueue,存储多定时器信息,该队列的节点的数据结构形式为TimerData,每打开一个定时器,将此定时器的标识和处理方法放到队列中,队列的节点数加1,;每关闭一个定时器,就将此定时器的标识和处理方法从队列中删除,队列的节点数减1;
步骤3:开启定时器,将定时器信息加入队列;
步骤4:从队列中取出一个节点,判断节点中存储的定时器标识是否与当前超时的定时器标识相同,若相同则执行步骤5,否则,若不同,则执行步骤6;
步骤5:节点中存储的定时器标识与当前超时的定时器标识相同,该节点对应的定时器超时,按照节点中对应的处理方法处理;
步骤6:判断是否已经取出所有节点,若是,则结束操作;否则,重复步骤4。
2.根据权利要求1所述的软件多定时器动态管理方法,其特征在于,步骤2中,所述队列TimerQueue中定义TimerQueue[n]表示TimerQueue的第N个节点;
TimerQueue[n].TimerID表示TimerQueue的第N个节点中存储的定时器标识;
TimerQueue[n].TimerFun表示TimerQueue的第N个节点中存储的定时器超时处理方法。
3.根据权利要求2所述的软件多定时器动态管理方法,其特征在于,步骤4通过定时器响应函数判断节点中存储的定时器标识是否与当前超时的定时器标识相同,具体为:在定时器响应函数中,依次找出队列中所有的定时器标识TimerQueue[n].TimerID,与当前定时器响应函数中的定时器标识nID相比较,如果相同,则当前为TimerQueue[n].TimerID所对应的定时器超时。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410668924.9A CN104391732B (zh) | 2014-11-20 | 2014-11-20 | 软件多定时器动态管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410668924.9A CN104391732B (zh) | 2014-11-20 | 2014-11-20 | 软件多定时器动态管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104391732A true CN104391732A (zh) | 2015-03-04 |
CN104391732B CN104391732B (zh) | 2018-12-11 |
Family
ID=52609640
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410668924.9A Active CN104391732B (zh) | 2014-11-20 | 2014-11-20 | 软件多定时器动态管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104391732B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105573841A (zh) * | 2015-12-10 | 2016-05-11 | 北京京东尚科信息技术有限公司 | 一种基于非关系型数据库的控制定时器执行的方法 |
CN106549879A (zh) * | 2015-09-22 | 2017-03-29 | 同方威视技术股份有限公司 | 可自动关联采集数据的处理方法、处理装置及其检测*** |
CN107870812A (zh) * | 2017-11-17 | 2018-04-03 | 南京国电南自轨道交通工程有限公司 | 一种基于单线程并发多定时器应用管理方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101014049A (zh) * | 2007-02-14 | 2007-08-08 | 中兴通讯股份有限公司 | 一种终端无线通信协议栈软件定时器管理方法 |
CN101727352A (zh) * | 2009-12-15 | 2010-06-09 | 四川长虹电器股份有限公司 | 一种定时器的实现方法 |
CN102207888A (zh) * | 2011-05-09 | 2011-10-05 | 大唐移动通信设备有限公司 | 定时器管理方法和装置 |
CN104093199A (zh) * | 2014-07-29 | 2014-10-08 | 中国联合网络通信集团有限公司 | 定时器设置方法和终端 |
-
2014
- 2014-11-20 CN CN201410668924.9A patent/CN104391732B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101014049A (zh) * | 2007-02-14 | 2007-08-08 | 中兴通讯股份有限公司 | 一种终端无线通信协议栈软件定时器管理方法 |
CN101727352A (zh) * | 2009-12-15 | 2010-06-09 | 四川长虹电器股份有限公司 | 一种定时器的实现方法 |
CN102207888A (zh) * | 2011-05-09 | 2011-10-05 | 大唐移动通信设备有限公司 | 定时器管理方法和装置 |
CN104093199A (zh) * | 2014-07-29 | 2014-10-08 | 中国联合网络通信集团有限公司 | 定时器设置方法和终端 |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106549879A (zh) * | 2015-09-22 | 2017-03-29 | 同方威视技术股份有限公司 | 可自动关联采集数据的处理方法、处理装置及其检测*** |
CN106549879B (zh) * | 2015-09-22 | 2021-07-27 | 同方威视技术股份有限公司 | 可自动关联采集数据的处理方法、处理装置及其检测*** |
CN105573841A (zh) * | 2015-12-10 | 2016-05-11 | 北京京东尚科信息技术有限公司 | 一种基于非关系型数据库的控制定时器执行的方法 |
CN105573841B (zh) * | 2015-12-10 | 2019-06-04 | 北京京东尚科信息技术有限公司 | 一种基于非关系型数据库的控制定时器执行的方法 |
CN107870812A (zh) * | 2017-11-17 | 2018-04-03 | 南京国电南自轨道交通工程有限公司 | 一种基于单线程并发多定时器应用管理方法 |
CN107870812B (zh) * | 2017-11-17 | 2021-06-15 | 南京国电南自轨道交通工程有限公司 | 一种基于单线程并发多定时器应用管理方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104391732B (zh) | 2018-12-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106790599B (zh) | 一种基于多核无锁环形缓冲区的共生虚拟机通信方法 | |
CN108847994A (zh) | 基于数据分析的告警定位方法、装置、设备以及存储介质 | |
CN106407430A (zh) | 一种基于阶段桶的复杂智能合约状态同步方法 | |
CN104035786B (zh) | 一种软件定时器的优化方法及*** | |
CN104391732A (zh) | 软件多定时器动态管理方法 | |
CN104331315B (zh) | 一种任意层次json对象的解析与生成方法及*** | |
CN109976823A (zh) | 一种应用程序启动方法、装置及终端设备 | |
CN106886450A (zh) | 任务调度方法和*** | |
CN108073688A (zh) | 一种数据迁移的方法及装置 | |
CN104202199B (zh) | 检测接口状态并据接口状态处理接口故障的方法及*** | |
CN107506906A (zh) | 一种基于数据处理的任务智能调度引擎设计方法 | |
CN106502770A (zh) | 一种基于有限状态机的hmi状态迁移方法 | |
US11295258B2 (en) | Cross domain integration in product lifecycle management | |
CN106250429A (zh) | 一种基于sqoop的数据抽取方法 | |
CN103927244B (zh) | 一种基于动态代理实现的插件调度过程监控的方法 | |
CN107122203A (zh) | 一种配置文件的设置方法及装置 | |
CN110069247A (zh) | 一种应用程序的开发方法及装置、使用方法及装置 | |
CN106775620A (zh) | 一种定时方法及装置 | |
CN104462322B (zh) | 字符串比对方法和装置 | |
CN107239210A (zh) | 终端控制方法、装置、计算机装置及存储介质 | |
CN101552739A (zh) | 一种网络服务流程实例生命周期管理的方法及*** | |
CN101551811A (zh) | 用于实时数据etl***的记忆式调度方法 | |
CN106201442B (zh) | 应用程序的执行方法及装置 | |
Klein et al. | Hierarchical modeling and formal verification. An industrial case study using Reo and Vereofy | |
CN114612264A (zh) | 厂站网络安全设备配置自动校核方法及*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |