欢迎来到天天文库
浏览记录
ID:8159674
大小:33.00 KB
页数:6页
时间:2018-03-08
《利用delphi建立精确计数器》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、利用delphi建立精确计数器在delphi中最常用的是timer控件,它的设置和使用都非常方便,理论上它的记时精度可以达到1ms(毫秒)。但是众所周知的,实际上timer在记时间隔小于50ms之下是精度是十分差的。它只适用于对于精度要求不太高的场合。这里作者要介绍的是两种利用windowsapi函数实现精确记时的方法。第一中方法是利用高性能频率记数(作者本人的称呼)法。利用这种方法要使用两个api函数queryperformancefrequency和queryperformancecounte
2、r。queryperformancefrequency函数获得高性能频率记数器的震荡频率。调用该函数后,函数会将系统频率记数器的震荡频率(每毫秒)保存到一个largeinteger中。不过利用该函数在几台机器上做过试验,结果都是1193180。读者朋友可以在自己的机器上试一下queryperformancecounter函数获得系统频率记数器的震荡次数,结果也保存到一个largenteger中。很显然,如果在计时中首先使用queryperformancefrequency获得高性能频率记数器每毫秒
3、的震荡次数,然后在计时开始时使用queryperformancecounter函数获得当前系统频率记数器的震荡次数。在计时结束时再调用queryperformancecounter函数获得系统频率记数器的震荡次数。将两者相减,再将结果除以频率记数器每毫秒的震荡次数,就可以获得某一事件经过的准确时间。(次数除以频率等于时间)另外的一种精确记时器的功能是利用多媒体记时器函数(这也是作者的定义,因为这个系列的函数是在winmm.dll中定义并且是为媒体播放服务的)。实现多媒体记时器首先要使用timese
4、tevent函数建立计时事件。该函数在delphi中的mmsystem.pas中有定义,定义如下:functiontimesetevent(udelay,uresolution:uint;lpfunction:tfntimecallback;dwuser:dword;uflags:uint):mmresult;stdcall函数定义中参数udelay定义延迟时间,以毫秒为单位,该参数相当于timer控件的interval属性。参数uresolution定义记时精度,如果要求尽可能高的精度,要将该参
5、数设置为0;参数lpfunction定义了timesetevent函数的回调函数。该函数相当于一个定时中断处理函数,每当经过一个udelay长度的时间间隔,该函数就会被调用,编程者可以在该函数中加入相应的处理语句。参数dwuser定义用户自定义的回调值,该值将传递给回调函数。参数uflags定义定时类型,如果要不间断的记时,该值应设置为1。如果函数调用成功,在系统中建立了一个多媒体记时器对象,每当经过一个udelay时间后lpfunction指定的函数都会被调用。同时函数返回一个对象标识,如果不再
6、需要记时器则必须要使用timekillevent函数删除记时器对象。由于windows是一个多任务的操作系统,因此基于api调用的记时器的精度都会受到其它很多因素的干扰。到底这两中记时器的精度如何,我们来使用以下的程序进行验证:设置三种记时器(timer控件、高性能频率记数、多媒体记时器)。将它们的定时间隔设置为10毫秒,让它们不停工作直到达到一个比较长的时间(比如60秒),这样记时器的误差会被累计下来,然后同实际经过的时间相比较,就可以得到它们的精度。下面是具体的检测程序。unitunit1;i
7、nterfaceuseswindows,messages,sysutils,classes,graphics,controls,forms,dialogs,stdctrls,extctrls,mmsystem;typetform1=class(tform)edit1:tedit;edit2:tedit;edit3:tedit;button1:tbutton;button2:tbutton;timer1:ttimer;procedureformcreate(sender:tobject);proce
8、durebutton1click(sender:tobject);proceduretimer1timer(sender:tobject);procedurebutton2click(sender:tobject);private{privatedeclarations}public{publicdeclarations}end;varform1:tform1;acttime1,acttime2:cardinal;smmcount,stimercount,spcount:singl
此文档下载收益归作者所有