VB实现毫秒计时方案

VB实现毫秒计时方案

GetTickCount是最简单的获取时间的API函数,返回值是从开机到现在的时间,单位为毫秒。虽然它的返回值单位是毫秒,但是精度并不是1毫秒,误差大约在55毫秒左右,MSDN中这样说“If you need a higher resolution timer, use a multimedia timer or a high-resolution timer.”。

multimedia timer:

timeGetTime函数实现的效果与GetTickCount差不多,返回值也是从开机到现在的时间,单位为毫秒。但是它的精度仍然不能达到1毫秒,误差在5毫秒以上,MSDN中这样说“Windows NT/2000: The default precision of the timeGetTime function can be five milliseconds or more, depending on the machine. ”。

high-resolution timer:

计算机里所能达到的最高精度就是使用QueryPerformanceFrequency和QueryPerformanceCounter这两个API,这两个API都是获取硬件(比如说CPU)的计数器,不同的硬件获取的值也不同。

其中QueryPerformanceFrequency是获取振荡频率,每秒振荡多少次;QueryPerformanceCounter是获取当前振荡次数。

例如:

假设QueryPerformanceFrequency获取的振荡频率是每秒5000次,应用程序第一次调用QueryPerformanceCounter获得的振荡次数是1500次,第二次调用QueryPerformanceCounter获得的振荡次数是3500次,那么这两次调用QueryPerformanceCounter的时间间隔就是(3500-1500)/5000=0.04秒

如果仅仅为了计算时间偏差,可以使用 GetSystemTimeAsFileTime,这个精度可以达到100纳秒,

msdn有个介绍。

http://msdn.microsoft.com/ZH-CN/library/windows/desktop/ms724284(v=vs.85).aspx

Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).

It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times. Instead, you should copy the low- and high-order parts of the file time to a ULARGE_INTEGER structure, perform 64-bit arithmetic on the QuadPart member, and copy the LowPart and HighPart members into the FILETIME structure.

Do not cast a pointer to a FILETIME structure to either a ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows.

方案1:使用GetLocalTime

Private Declare Sub GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)

Private Type SYSTEMTIME

wYear As Integer

wMonth As Integer

wDayOfWeek As Integer

wDay As Integer

wHour As Integer

wMinute As Integer

wSecond As Integer

wMilliseconds As Integer

End Type

Private Sub Form_Load()

Timer1.Interval = 1

End Sub

Private Sub Timer1_Timer()

Dim t As SYSTEMTIME

GetLocalTime t

Cls

Print DateSerial(t.wYear, t.wMonth, t.wDay) & " " & TimeSerial(t.wHour, t.wMinute, t.wSecond) & "." & t.wMilliseconds

End Sub

方案2:

GetTickCount是最简单的获取时间的API函数,返回值是从开机到现在的时间,单位为毫秒。虽然它的返回值单位是毫秒,但是精度并不是1毫秒,误差大约在55毫秒左右,MSDN中这样说“If you need a higher resolution timer, use a multimedia timer or a high-resolution timer.”。

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

Private Function My_Delay(sSeconds As Long) '延时函数 Delay(毫秒)

Begin = GetTickCount

a = 0

Do While a < sSeconds

a = GetTickCount - Begin

DoEvents

Loop

End Function

Private Sub Command1_Click()

My_Delay 1000

MsgBox "123"

End Sub

方案3:

Private Sub Command1_Click()

dim c,d,e

c = Timer

d = Timer

e = d - c

msgbox “时间差:” & e

End Sub