知识大全 利用Delphi建立精确计数器[1]
Posted 函数
篇首语:老骥伏枥,志在千里;烈士暮年,壮心不已。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用Delphi建立精确计数器[1]相关的知识,希望对你有一定的参考价值。
利用Delphi建立精确计数器[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在Windows中的很多场合下编程(例如工业控制 游戏)中需要比较精确的记时器 本文讨论的是在Delphi下实现记时器的若干方法以及它们的精度控制问题
在Delphi中最常用的是Timer控件 它的设置和使用都非常方便 理论上它的记时精度可以达到 ms(毫秒) 但是众所周知的 实际上Timer在记时间隔小于 ms之下是精度是十分差的 它只适用于对于精度要求不太高的场合
这里作者要介绍的是两种利用Windows API函数实现精确记时的方法 第一中方法是利用高性能频率记数(作者本人的称呼)法 利用这种方法要使用两个API函数QueryPerformanceFrequency和QueryPerformanceCounter QueryPerformanceFrequency函数获得高性能频率记数器的震荡频率
调用该函数后 函数会将系统频率记数器的震荡频率(每毫秒)保存到一个LargeInteger中 不过利用该函数在几台机器上做过试验 结果都是 读者朋友可以在自己的机器上试一下
QueryPerformanceCounter函数获得系统频率记数器的震荡次数 结果也保存到一个Largenteger中
很显然 如果在计时中首先使用QueryPerformanceFrequency获得高性能频率记数器每毫秒的震荡次数 然后在计时开始时使用QueryPerformanceCounter函数获得当前系统频率记数器的震荡次数 在计时结束时再调用QueryPerformanceCounter函数获得系统频率记数器的震荡次数 将两者相减 再将结果除以频率记数器每毫秒的震荡次数 就可以获得某一事件经过的准确时间 (次数除以频率等于时间)
另外的一种精确记时器的功能是利用多媒体记时器函数(这也是作者的定义 因为这个系列的函数是在Winmm dll中定义并且是为媒体播放服务的)
实现多媒体记时器首先要使用timeSetEvent函数建立计时事件 该函数在Delphi中的mmsystem pas中有定义 定义如下
function timeSetEvent(uDelay uResolution: UINT;
lpFunction: TFNTimeCallBack; dwUser: DWORD; uFlags: UINT): MMRESULT; stdcall
函数定义中参数uDelay定义延迟时间 以毫秒为单位 该参数相当于Timer控件的Interval属性 参数uResolution定义记时精度 如果要求尽可能高的精度 要将该参数设置为 参数lpFunction定义了timeSetEvent函数的回调函数 该函数相当于一个定时中断处理函数 每当经过一个uDelay长度的时间间隔 该函数就会被调用 编程者可以在该函数中加入相应的处理语句 参数dwUser定义用户自定义的回调值 该值将传递给回调函数 参数uFlags定义定时类型 如果要不间断的记时 该值应设置为
如果函数调用成功 在系统中建立了一个多媒体记时器对象 每当经过一个uDelay时间后lpFunction指定的函数都会被调用 同时函数返回一个对象标识 如果不再需要记时器则必须要使用timeKillEvent函数删除记时器对象
由于Windows是一个多任务的操作系统 因此基于API调用的记时器的精度都会受到其它很多因素的干扰 到底这两中记时器的精度如何 我们来使用以下的程序进行验证
设置三种记时器(Timer控件 高性能频率记数 多媒体记时器) 将它们的定时间隔设置为 毫秒 让它们不停工作直到达到一个比较长的时间(比如 秒) 这样记时器的误差会被累计下来 然后同实际经过的时间相比较 就可以得到它们的精度
cha138/Article/program/Delphi/201311/25026相关参考
利用Delphi建立精确计数器[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! proced
利用Delphi建立精确计数器[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 下面是具体的
Delphi中票据凭证的精确打印 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一概述 在银行
在Delphi中建立和使用别名[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 通常我们在D
知识大全 Delphi 中动态链接库(dll)的建立和使用[1]
Delphi中动态链接库(dll)的建立和使用[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Delphi学堂之在Delphi中自己建立交叉表 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!fu
Delphi数据库的动态建立 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! delphi最吸引人
在Delphi中建立和使用别名[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 建立使用IN
在Delphi中建立和使用别名[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 设置模式的主
知识大全 Delphi 中动态链接库(dll)的建立和使用[2]
Delphi中动态链接库(dll)的建立和使用[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!