Windows平台下毫秒级异步定时器的实现方法

文档序号:9887390阅读:488来源:国知局
Windows平台下毫秒级异步定时器的实现方法
【专利说明】Windows平台下毫秒级异步定时器的实现方法
[0001]
技术领域
[0002]本发明属于自动售票机系统领域,具体是一种Windows平台下毫秒级异步定时器的实现方法。
【背景技术】
[0003]自动售票机是地铁自动售检票系统中最复杂的专用设备,技术涉及机械、电子、软件、控制、金融、射频等多个方面。Windows设计之初并不是以实时系统为目标的,所以Windows系统的时间精度一直不高,实际最小单位是15ms左右,导致的结果就是所有Windows的时间、线程相关的操作都无法以Ims来实现精确控制。自动售票机系统对实时性要求比较高,因此需要一种高精度的定时器来实现定时服务。自动售票机系统与相关设备(如硬币机)之间的通信都有一定的超时值来保证相应的通信质量,这些值通常都是毫秒级。高精度的异步定时器提高了系统的效率和准确性。

【发明内容】

[0004]本发明的目的在于提供一种有效的windows平台下毫秒级异步定时器的实现方法,它主要基于CPU时钟周期,用于实现毫秒级且对秒级进行精确控制,并将之用于自动售票机系统中,从而弥补Windows平台下定时不正确、同步方式定时所带来的实时性差等缺陷。
[0005]实现本发明目的的技术解决方案为:一种Windows平台下毫秒级异步定时器的实现方法,具体方法如下:
创建定时器管理类和退出事件;
同时开启定时器巡检线程和秒变化巡检线程;
定时器巡检线程检查退出信号,如果没有退出信号就调用定时器管理类的invokelf T imeout方法,该方法首先得到当前时间的时钟周期数,然后遍历在其中注册的定时器,如果定时器设置的超时值小于当前值,则说明已经超时,如果需要重置,则重新以定时间隔(M_INTERVAL)设置超时值,接着调用其中的invoke方法开启另一个线程执行定时器中的任最后清理完成任务的定时器;如此循环往复,直至收到退出信号;
秒变化巡检线程检查退出信号,如果没有退出信号就重复不断地检查系统时间,若秒变化,则发送通知以更新时钟;首先,获得系统的时间,检查系统当前时间的毫秒数,如果该毫秒数小于n,则说明发生了秒变化;如果这一秒中没有调用过回调函数,就设置标志说明该秒的回调已经完成,然后调用其完成任务;否则设置一个标志说明该秒的回调没有完成;如果该值不小于η则让线程睡眠
t ms再进行检查;如此不断重复直至收到退出信号。
[0006]本发明与现有技术相比,其显著优点为:(1)实现了精确毫秒级定时,满足了不同的任务有不同的定时的要求,利用CPU主频的时钟周期来计算时间,可靠性高且准确,误差小,满足系统实时性要求。(2)实现异步定时器,改变了目前windows平台下同步定时的方式,降低了定时误差,适应多任务、多线程的环境。(3)实现了用户模式下的定时方法,以往定时器的使用都是利用内核中的定时方法,其可控性比较差,现在只是利用系统中的系统调用来获取系统滴答数,无需调用其它内核函数。
【附图说明】
[0007]图1是本发明Windows平台下毫秒级异步定时器的实现Timer类图。
[0008]图2是本发明Windows平台下毫秒级异步定时器的实现Timers类图。
[0009]图3是本发明Windows平台下毫秒级异步定时器的流程图。
【具体实施方式】
[0010]本发明通过计算CPU主频的方法来实现定时器,将所需要的定时转化为CPU时钟周期(主频的倒数)的倍数。当CPU不断运行,其时钟周期不断增加直至到达所设置的值,这样就超时了,此时采取相应的动作;而CPU时钟周期是纳秒级的,因此实现了实现毫秒级定时器。
[0011 ] 本发明Windows平台下毫秒级异步定时器实现方法,包含 1.1实现定时器:
η每个定时器类对象包含:定时器ID、定时间隔、生命作用时间、定时回调函数、超时值,自动重置标志,回调标志和线程信息。
[0012]η每个定时器都包含相应的方法。这些方法设置超时值,在一个线程中进行回调,终止回调的执行,结束线程。定时器可分为周期性和一次性的。
[0013]1.2实现定时器管理类:
η定时器管理类用来管理定时器。它可以添加和删除定时器。该类中有一个容器-链表,链表中元素是一个定时器对象。利用C++标准库中list实现添加和删除定时器。
[0014]η该类还实现清除容器、引发定时时间已到定时器的回调、检查并清理已结束回调的句柄和销毁所有的定时器。
[0015]1.3时间服务类:
η时间服务类拥有一个定时器管理类指针,所有的定时任务都委托给定时器管理类来实现;
定时器还实现了每过一秒就能发生回调。
[0016]下面结合附图对本发明作进一步详细描述。
[0017]图1说明了定时器类,定时器类对象包含:定时器ID(M_ID)、定时间隔(Μ_INTERVAL)、生命作用时间(M_CBMAXLIFEHME)、定时回调函数(M_ELAPSEDCALLBACK)、超时值(M_TICK0FHME0UT),自动重置标志(M_AUT0REST),回调标志(M_ENABLED)和线程信息(M_THREADINF0)。其还有在一个线程中进行回调(invoke),终止回调的执行(abort)等等方法。定时器可分为周期性和一次性的。图2说明了定时器管理类,其用来管理定时器。它可以添加(ADD)和删除(REMOVE)定时器。该类中有一个链表(M_HMERS),链表中元素是一个定时器对象。利用C++标准库中list实现添加和删除定时器。其它一些方法用于销毁资源。
[0018]图3给出了本发明的工作流程图。首先,创建定时器管理类和退出事件。开启定时器巡检线程和秒变化巡检线程。定时器巡检线程检查退出信号,如果没有退出信号就调用定时器管理类的invokelf T imeout方法,该方法首先得到当前时间的时钟周期数,然后遍历在其中注册的定时器,如果发现有定时器设置的超时值小于当前值则说明已经超时,如果需要重置,则重新以定时间隔(M_INTERVAL)设置超时值,接着就调用其中的invoke方法开启另一个线程执行定时器中的任务m_ElapsedCallback。而此时并不等待任务执行完后才继续执行当前工作,这就是异步定时器。最后清理完成任务的定时器。如此循环往复,直至收到退出信号。
[0019]秒变化巡检线程检查退出信号,如果没有退出信号就重复不断地检查系统时间,若秒变化,则发送通知以更新时钟。首先,获得系统的时间,检查系统时间的毫秒数,如果发现其小于50,这说明发生了秒变化。如果这一秒中没有调用过回调函数,设置标志说明该秒的回调已经完成,并调用其完成任务。否则设置一个标志说明该秒的回调没有完成。如果该值不小于50则让线程睡眠1ms再检查。如此不断重复直至收到退出信号。当然,时间服务类中有两个标志表示是否可以执行定时器和秒变化的任务。
【主权项】
1.一种Windows平台下毫秒级异步定时器的实现方法,其特征在于具体方法如下: 创建定时器管理类和退出事件; 同时开启定时器巡检线程和秒变化巡检线程; 定时器巡检线程检查退出信号,如果没有退出信号就调用定时器管理类的invokelf T imeout方法,该方法首先得到当前时间的时钟周期数,然后遍历在其中注册的定时器,如果定时器设置的超时值小于当前值,则说明已经超时,如果需要重置,则重新以定时间隔(M_INTERVAL)设置超时值,接着调用其中的invoke方法开启另一个线程执行定时器中的任最后清理完成任务的定时器;如此循环往复,直至收到退出信号; 秒变化巡检线程检查退出信号,如果没有退出信号就重复不断地检查系统时间,若秒变化,则发送通知以更新时钟;首先,获得系统的时间,检查系统当前时间的毫秒数,如果该毫秒数小于n,则说明发生了秒变化;如果这一秒中没有调用过回调函数,就设置标志说明该秒的回调已经完成,然后调用其完成任务;否则设置一个标志说明该秒的回调没有完成;如果该值不小于η则让线程睡眠 t ms再进行检查;如此不断重复直至收到退出信号。2.根据权利要求1所述的Windows平台下毫秒级异步定时器的实现方法,其特征在于:定时器类对象包含:定时器ID(M_ID)、定时间隔(M_INTERVAL)、生命作用时间(M_CBMAXLIFEHME)、定时回调函数(M_ELAPSEDCALLBACK)、超时值(M_TICK0FHME0UT),自动重置标志(M_AUTOREST),回调标志(M_ENABLED)和线程信息(M_THREADINFO);定时器管理类包含添加(ADD)和删除(REMOVE)定时器;该类中有一个链表(MJIMERS),链表中元素是一个定时器对象。3.根据权利要求1或2所述的Windows平台下毫秒级异步定时器的实现方法,其特征在于:所述创建好定时器管理类后,可以利用定时器管理类中的ADD方法和REMOVE方法来注册或取消相应的定时器。4.根据权利要求3所述的Windows平台下毫秒级异步定时器的实现方法,其特征在于:所述注册定时器是设置定时器类对象的定时器ID(M_ID)、定时间隔(M_INTERVAL)、生命作用时间(M_CBMAXLIFETIME)、定时回调函数(M_ELAPSEDCALLBACK)、超时值(M_TICK0FTIME0UT)、自动重置标志(M_AUTOREST)、回调标志(M_ENABLED)和线程信息(M_THREADINFO)这些值,然后将这个定时器对象放到链表(M_TMERS)中,供invokelf Timeout方法遍历。5.根据权利要求1所述的Windows平台下毫秒级异步定时器的实现方法,其特征在于:所述η的值为50,t为I Oms。
【专利摘要】本发明公开了一种Windows平台下毫秒级异步定时器的实现方法。本发明通过计算CPU主频的方法来实现定时器,将所需要的定时转化为CPU时钟周期(主频的倒数)的倍数。当CPU不断运行,其时钟周期不断增加直至到达所设置的值,这样就超时了,此时采取相应的动作;而CPU时钟周期是纳秒级的,因此实现了实现毫秒级定时器。本发明解决了用户模式下实现毫秒级且对秒级进行精确控制异步定时器的问题,并将之用于自动售票机系统中。
【IPC分类】G06F9/44
【公开号】CN105653286
【申请号】
【发明人】徐骏善, 汪惠芬, 柳林燕, 宋豪杰, 宋柯
【申请人】南京理工大学
【公开日】2016年6月8日
【申请日】2015年12月31日
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1