admin 管理员组

文章数量: 1086019


2024年3月27日发(作者:pcanywhere无法连接)

VB高精度计时器编程的讨论

在很多场合下编程(例如工业控制、游戏)中需要比较精确的记时器,本文讨论的是

在VB下实现记时器的若干方法以及它们的精度控制问题。 在VB中最常用的是Timer控

件,它的设置和使用都非常方便,理论上它的记时精度可以达到1ms(毫秒)。但是众所周

知的,实际上Timer在记时间隔小于50ms之下是精度是十分差的。它只适用于对于精度

要求不太高的场合。

这里笔者要介绍的是两种利用Windows API函数实现精确记时的方法。第一种方法

是利用高性能频率记数(作者本人的称呼)法。利用这种方法要使用两个API函数

QueryPerformanceFrequency和QueryPerformanceCounter。

QueryPerformanceFrequency函数获得高性能频率记数器的震荡频率,该函数的定义如

下:

Private Declare Function QueryPerformanceFrequency Lib "kernel32"

(lpFrequency As LARGE_INTEGER) As Long

函数中的数据结构LARGE_INTEGER定义如下:

Type LARGE_INTEGER

lowpart As Long

highpart As Long

End Type

调用该函数后,函数会将系统频率记数器的震荡频率保存到lpPerformanceCount中,

其中低位保存到lowpart中,高位保存到highpart中。但是现在的Windows没有使用

到hightpart(系统频率记数器的震荡频率与计算机的主频无关,我在几台机上做过验证,

都是lowpart为1193180,highpart为0)。

QueryPerformanceCounter函数获得系统频率记数器的震荡次数,函数的定义如下:

Private Declare Function QueryPerformanceCounter Lib "kernel32"

(lpPerformanceCount As LARGE_INTEGER) As Long

获得记时器震荡次数保存在lpPerformanceCount中。

显然,如果首先获得利用QueryPerformanceFrequency函数获得频率记数器的震荡

频率,然后在执行某个程序段之前调用QueryPerformanceCounter函数获得频率记数器

的震荡次数,在程序段结束再调用QueryPerformanceCounter函数获得频率记数器的震

荡次数,将两次获得的震荡次数相减后再除以震荡频率就获得的了两次间隔之间的时间(以

秒为单位)。如果在程序中建立一个循环,在循环中不停的调用

QueryPerformanceCounter获得频率记数器的震荡次数并同先前的频率记数器的震荡次

数相减,将结果除以频率记数器的震荡频率,如果达到一定的时间就执行某个任务,这样

就实现了一个比较精确的记时器的功能。

另外的一种精确记时器的功能是利用多媒体记时器函数(这也是作者的定义,因为这

个系列的函数是在中定义并且是为媒体播放服务的)。


本文标签: 频率 函数 震荡 获得 记数器