C,则在每次达到定时时间后调用回调函数。
如果函数调用成功,在系统中建立了一个多媒体记时器对象,每当经过一个uDelay时间后lpFunction指定的函数都会被调用。同时函数返回一个对象标识,如果不再需要记时器则必须要使用timeKillEvent函数删除记时器对象。
由于Windows是一个多任务的操作系统,因此基于API调用的记时器的精度都会受到其它很多因素的干扰。到底这两中记时器的精度如何,我们来使用以下的
程序进行验证:
设置三种记时器(Timer控件、高性能频率记数、多媒体记时器)。将它们的定时间隔设置为10毫秒,让它们不停工作直到达到一个比较长的时间(比如60秒),这样记时器的误差会被累计下来,然后同实际经过的时间相比较,就可以得到它们的精度。
下面是具体的检测
程序。
首先建立一个工程文件,在Form1中加入一个Timer控件,两个CommandButton控件和三个TextBox控件,然后在Form1的代码窗口中加入以下代码
Option Explicit
Private Sub Command1_Click()
Dim lagTick1 As LARGE_INTEGER
Dim lagTick2 As LARGE_INTEGER
Dim lTen As Long
Command2.Enabled = True
Command1.Enabled = False
iCountStart = 60
lmmCount = 60
TimerCount = 60
actTime1 = GetTickCount
lTimeID = timeSetEvent(10, 0, AddressOf TimeProc, 1, 1)
Timer1.Enabled = True
lTen = 10 * lMSFreq
Call QueryPerformanceCounter(lagTick1)
lagTick2 = lagTick1
While iCountStart > 0
Call QueryPerformanceCounter(lagTick2)
''如果时钟震动次数超过10毫秒的次数则刷新Text1的显示
If lagTick2.lowpart - lagTick1.lowpart > lTen Then
lagTick1 = lagTick2
iCountStart = iCountStart - 0.01
Text1.Text = Format$(iCountStart, "00.00")
End If
DoEvents
Wend
End Sub
Private Sub Command2_Click()
EndCount
End Sub
Private Sub Form_Load()
Dim lim As LARGE_INTEGER
Text1.Text = "60.00"
Text2.Text = "60.00"
Text3.Text = "60.00"
Command1.Caption = "开始倒记时"
Command2.Caption = "停止记时"
Command2.Enabled = False
''获得系统板上时钟频率
QueryPerformance