API/COM/系统相关
一种比GetTickCount 和Timer更精确的计时器
2017-05-22 21:55:57

'1秒=1000000微秒

'计时器可以使用 3种

'1.VB或VBA内置的Timer '不太准

'2.API函数GetTickCount 较准确

'3.apiQueryPerformanceCounter  apiQueryPerformanceFrequency 更准确

' 来源:Office中国 

apiQueryPerformanceCounter  apiQueryPerformanceFrequency 是一种更好取得Windows系统运行时间,且不同于GetTickCount的方法

Windows系统的应用程序编程接口函数(API)都是使用C/C++语言编写的,VB中使用系统API函数需要改写声明。

GetiTickCount函数的含义是:取得自Windows系统启动以来到现在所经过的时间(单位:ms)。

在VB6.0中,API函数:

GetTickCount的声明如下:Private Declare Function GetTickCount Lib "kernel32" () As Long

在Windows中,该函数的原型是:DWORD GetiTickCount

我们可以发现在VB系统下,Gettickcount返回的是Long类型,长4个字节,而在WIndows下,GetTickCount返回的是DWORD类型,长4个字节的无符号数据类型。DWORD类型的数据范围是:0 ~ 2^32。

Long类型的数据范围是:-2147483648~2147483647,作为GetTickCount函数的返回值,只能是:0~2147483647,经过计算大约是:24.86天,也就是说,使用VB编制的系统在使用了24.86天以后,使用GetTickCount读回来的值就是负数了!具体原因请参考:http://topic.csdn.net/u/20090708/20/c2d2370d-d506-441e-b3c0-5aa3a6bcd566.html

但有一种更好的方法,比GetTickCount函数更好:

VB codeOption Explicit

Private Declare Function apiQueryPerformanceCounter Lib "kernel32" Alias "QueryPerformanceCounter" _

                                                (lpPerformanceCount As Currency) As Long

Private Declare Function apiQueryPerformanceFrequency Lib "kernel32" Alias "QueryPerformanceFrequency" _

                                                (lpFrequency As Currency) As Long

Private Declare Function GetTickCount Lib "kernel32" () As Long

'----------------------------------------------------

'函数功能:计算Windows自启动以来所经历的时间(s)

'返回类型:Double类型,你可以修改它,也可以返回整形。

'

'------------------------------------------------------

Public Function myTimer() As Double

    Dim freq As Currency

    Dim count As Currency

On Error GoTo errFun

    apiQueryPerformanceFrequency freq        '频率 相当于速度 v

    apiQueryPerformanceCounter count         '已发脉冲数 相当于距离 s

    myTimer= count / freq                    '计算时间 t=s/v

    Exit Function

errFun:

    myTimer= 0

End Function