查看單個文章
舊 2005-06-29, 02:34 PM   #2 (permalink)
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:98 | 在線時長:10161小時 | 升級還需:36小時級別:98 | 在線時長:10161小時 | 升級還需:36小時級別:98 | 在線時長:10161小時 | 升級還需:36小時級別:98 | 在線時長:10161小時 | 升級還需:36小時級別:98 | 在線時長:10161小時 | 升級還需:36小時級別:98 | 在線時長:10161小時 | 升級還需:36小時級別:98 | 在線時長:10161小時 | 升級還需:36小時級別:98 | 在線時長:10161小時 | 升級還需:36小時
註冊日期: 2002-12-07
文章: 13488
精華: 0
現金: 26849 金幣
資產: 3024779 金幣
預設

在講應用前再補充一些

'GetTickCount()
'Windows NT 3.5 及更高版本,精度為 10ms
'Windows NT 3.1 及更高版本,精度為 16ms
'Windows 95 及更高版本,精度為 55ms

'timeGetTime()
'精度約1ms , 此式適用於大多數應用場合

Public Declare Function timeGetTime Lib "winmm.dll" () As Long
'1s = 1000ms = 1000000μs = 1000000000ns

那微秒級數的呢?

'得到處理器使用的主機板內部計時器的時鐘頻率
Private Declare Function QueryPerformanceFrequency Lib "kernel32" ( _
lpFrequency As Currency) As Long 'LARGE_INTEGER

Private Declare Function QueryPerformanceCounter Lib "kernel32" ( _
lpPerformanceCount As Currency) As Long 'LARGE_INTEGER

原本QueryPerformanceFrequency 和 QueryPerformanceCounter 的參數之資料型態是 LARGE_INTEGER

Type LARGE_INTEGER '佔 8 byte
lowpart As Long
highpart As Long
End Type

因為要簡省換算是改成同樣是 8byte 的 Currency(for VB,C 的話可用 LONGLONG)

=================
timeGetTime 的實例同第一例子
所以這裡示範 高精度(微秒)

if not GetTickCount_MicroSec(True) then
MsgBox "不支持高精度計數器!"
else
Do
Call S()
DoEvents
ReviseTimerTickMicroSec = GetTickCount_MicroSec
Loop Until ReviseTimerTickMicroSec > 1000 '1000us=1ms
endif
.....
Public Function GetTickCount_MicroSec(Optional ByRef blnCountStart As Boolean)
Static TickCount1 As Currency
Dim TickCount2 As Currency
Dim Freq As Currency

If QueryPerformanceFrequency(Freq) Then
If blnCountStart Then
QueryPerformanceCounter TickCount1
GetTickCount_MicroSec = True
Else
QueryPerformanceCounter TickCount2
GetTickCount_MicroSec = (Abs(TickCount2 - TickCount1) / Freq) * 1000000 '10^6
End If
Else
'MsgBox "不支持高精度計數器!"
GetTickCount_MicroSec = False
End If

End Function
mini 目前離線  
送花文章: 2053, 收花文章: 8067 篇, 收花: 26918 次
回覆時引用此帖