版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
为了测试计时器运行,我换了一台计算机。
但是这次测试的结果却差强人意,测试了2次,手机秒表时间和程序计次:
1'00.35 3857
1'00.35 3834
前面明明好好的计时器,在另外一台电脑上却不行了。
原电脑是很久的一台电脑,win7系统,这台电脑是前两年配的,win10系统。
按理新电脑处理速度更快,应该比旧电脑更接近准确时间,十分奇怪。
只能推测,新电脑与旧电脑时间片上有差异。设置1ms的间隔,实际在这台电脑对应差不多15ms。
这次为了获得高精度计时器,根据网上的资料,写了以下代码:
Public Class CustomTimerSW
Private sw As Stopwatch
Public Property Interval As Integer
Public Event Tick()
Public Property Enabled As Boolean
Sub New()
Me.Interval = 100
Me.Enabled = False
sw = New Stopwatch()
End Sub
Sub New(ByVal Interval As Integer)
Me.Interval = Interval
Me.Enabled = False
sw = New Stopwatch()
End Sub
Public Sub Start()
Me.Enabled = True
Dim th As New Threading.Thread(AddressOf count)
th.Start()
End Sub
Private Sub count()
sw.Start()
Dim nowCount As Long = sw.ElapsedMilliseconds
Do While Me.Enabled
If (sw.ElapsedMilliseconds - nowCount >= Interval) Then
RaiseEvent Tick()
nowCount = sw.ElapsedMilliseconds
End If
Loop
End Sub
Public Sub [Stop]()
Me.Enabled = False
End Sub
End Class
窗体上的调用:
Public Class Form1
Dim counter1 As Integer
Dim counter2 As Integer
Dim counter3 As Integer
Dim ct As CustomTimer
Dim ctsw As CustomTimerSW
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.CheckForIllegalCrossThreadCalls = False
counter1 = 0
counter2 = 0
counter3 = 0
Timer1.Interval = 1
ct = New CustomTimer(1)
AddHandler ct.Tick, AddressOf CustomTimer_Tick
ctsw = New CustomTimerSW(1)
AddHandler ctsw.Tick, AddressOf CustomTimerSW_Tick
End Sub
Private Sub CustomTimerSW_Tick()
counter3 += ctsw.Interval
TextBox3.Text = counter3
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
If ctsw.Enabled = True Then
ctsw.Stop()
Else
ctsw.Start()
End If
End Sub
这次在新电脑上的运行结果:
1'00.43 56641
1'00.16 58004
1'00.22 58175
手机时间换算为毫秒后的结果:
60430 56641
60160 58004
60220 58175
算下来时间上相差2-3秒。应该还算是精度比较高了。
后续:12月18日将程序部分代码修改了一下,在tick时不显示,最后在显示。
Private Sub CustomTimerSW_Tick()
counter3 += ctsw.Interval
'TextBox3.Text = counter3
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
If ctsw.Enabled = True Then
ctsw.Stop()
TextBox3.Text = counter3
Else
ctsw.Start()
End If
End Sub
手机秒表测试1'00.13,程序运行结果60122。算下来差8毫秒,精度基本接近1ms,毫秒级。
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录



