windows中的精度定时问题

windows中的精度定时问题

ID:14970197

大小:36.50 KB

页数:4页

时间:2018-07-31

windows中的精度定时问题_第1页
windows中的精度定时问题_第2页
windows中的精度定时问题_第3页
windows中的精度定时问题_第4页
资源描述:

《windows中的精度定时问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Windows中的精度定时问题  在Windows中,可以使用不同精度的定时器来满足不同的要求:  1、使用Timer组件  它其实是先调用SetTimer()函数建立一个定时器,然后每隔一定的时间向Windows发送一个WM_TIMER的消息,操作系统捕获此消息后处理相应的事件。但是由于Windows的定时器是建立在DOS的1CH的中断基础上的,而此中断的响应频率是每秒18.2次,所以Timer组件对小于55ms的计时器就无能为力了。此外,WM_TIMER消息没胡被处理时,定时器又触发了新的WM_TIMER消息就会被舍弃。因此组件只能适用于那些对时间要求不是很严格的场合。  2、

2、使用多媒体定时器  使用多媒体定时器不容易遗失消息,且触发的最小时间间隔在10ms左右,可以称之为高精度定时器,它主要是使用TimeSetEvent()函数建立定时器事件,通过回调函数来触发,多媒体定时器会在程序中建立另外一个线程,不妨称为A线程。当定时器触发时,此线程就会暂时停下来,进行环境切换,切换到设定计时器的线程,执行回调函数,而不管线程的工作,这就是多媒体定时器定时精度的原因。此外A线程的优先级是15级,比大多数线程都高,所以可以很方便地执行此线程中的代码。  3、高精度定时器  可以使用Win32的取得计数器频率的函数QueryPerformanceFrequence(

3、)和取得计数值的函数QueryPerformanceCounter()来获得更高的计时精度。其中QueryPerformanceCounter()在IntelX86上准确度为0.8ms。                                         《工业控制计算机》2006.3,27-30      国防科技大学机电工程与仪器系(张云洲梁科山)    在工业控制软件中,数据采集和实时控制是经常性的工作。目前,工业控制软件已经从DOS和Windows3.x平台,转到了Windows95上。然而,Windows95并不能直接支持中断,这就意味着在DOS和Window

4、s3.x中的定时器中断不能为我们所用。因此,我们必须寻求新的定时方式。  在C++Builder和Delphi等典型的编程语言中,都提供了定时器控件,可以方便地实现定时和事件响应。此外,Windows95还提供了SetTimer和KillTimer函数来设置和删除一个定时器,在事件WM_TIMER响应函数中实现处理。然而,遗憾的是,通过这些方式获得的Win95定时器最小只能精确到55毫秒,对于55毫秒以下的时间精度便无能为力。这对于Win95下测控软件的开发是十分不利的。幸运的是,多媒体定时器可以解决这一难题。  以下是一个完整的多媒体定时器设计示例程序,该定时器的精度为1毫秒。该

5、程序的内容十分简单:按下按钮1,启动定时器,在Edit框中显示定时值(计数值),按下按钮2则将关闭定时器。此程序在Windows95环境下,采用C++Builder3.0编程并编译通过,但设计思想同样适用于其它高级语言。按照本程序中的实现方法,读者将可以轻松实现自己的高精度定时器。程序清单如下:#include#pragmahdrstop#include"mmsystem.h"  //包含多媒体定时器函数的头文件#defineMilliSecond 1 //定时间隔1毫秒#defineAccuracy    1 //系统允许的分辨率最小值#defineMin(x,y)

6、 ((xy)?x:y)#include"HighTimerU.h"//------------------------------------------------#pragmapackage(smart_init)#pragmaresource"*.dfm"UINTTimerID;   //定义定时器句柄intcount;      //定义一个变量以进行计数intTimerAccuracy;TForm1*Form1;//------------------------------------------------__f

7、astcallTForm1::TForm1(TComponent*Owner)   :TForm(Owner){}voidPASCALTimerCallProc(UINT TimerID,UINTmsg,DWORDdwUser,          DWORDdwa,DWORDdwb) //定义定时器事件的调用函数{   count++;   Form1->Edit1->Text=count;  //在一个编辑框内显示计数值,即定时值}//---------------

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。