首页 > 代码库 > VB实现毫秒计时方案

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

VB实现毫秒计时方案