栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

vb.net 高精度定时器 1ms级

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

vb.net 高精度定时器 1ms级

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

为了测试计时器运行,我换了一台计算机。

但是这次测试的结果却差强人意,测试了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 教程 目录

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955537.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号