【问题标题】:StopWatch and Timer Accuracy秒表和计时器精度
【发布时间】:2021-11-12 17:52:57
【问题描述】:

我正在使用以下代码来控制标签以输出秒表。按钮正常工作,标签输出的信息大多正确,但它只会每隔一段时间更新一次,我希望标签每毫秒更新一次信息。

Private SW As New Stopwatch
    Dim timercount As Integer = 1 'The number of seconds 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        SW.Start()
        Timer1.Start()
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Timer1.Enabled = False 'Stop the timer
        timercount = 0 'Reset to 0 seconds
        Label10.Text = "00:00:00.000"
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim ts As TimeSpan = SW.Elapsed
        Label10.Text = ts.ToString("hh\:mm\:ss\.fff")
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Timer1.enabled = False
    End Sub

非常感谢任何帮助。

【问题讨论】:

  • 每毫秒 ?那么您在计时器上设置的时间间隔是多少?请参阅文档中的备注部分docs.microsoft.com/en-us/dotnet/api/…
  • 您的显示器的刷新率是否为 1000 Hz?以每秒 30 次的速度更新显示的值会更合理,但会将值显示为最接近的毫秒。
  • 每秒 30 次可能没问题,但现在它似乎正在跳过几秒钟的显示。它从“00:00:00.000”到“00:00:00.986”再到“00:00:01.199”,所以它至少不是每秒都显示。
  • 每秒两次可能没问题,并且会使您的应用方式更好地使用资源...
  • 请注意,您将受制于 Windows 计时器分辨率;默认分辨率在 15 到 16 毫秒之间。您可以在 Bruce Dawson 的博客文章中阅读有关计时器分辨率规则的更多信息:randomascii.wordpress.com/2020/10/04/…

标签: vb.net winforms


【解决方案1】:

您可以将计时器设置为合理的值,例如每秒 20 次,以快速显示它的变化。

您可以在代码中创建计时器和秒表,我认为这比在表单中添加控件更容易——您可以在代码中看到正在编程的内容。我为按钮使用了合理的名称,这样您就可以知道它们的用途。

如果您将显示数据的子程序与处理数据的代码分开,那么很容易只在一个地方更改显示,以防有人决定将其写成文字,或者可能是小时在一个单独的盒子里,或者什么的。

Public Class Form1
    Dim sw As New Stopwatch
    Dim tim As Timer

    Private Sub ShowElapsedTime()
        lblTime.Text = sw.Elapsed.ToString("hh\:mm\:ss\.fff")

    End Sub

    Private Sub bnStart_Click(sender As Object, e As EventArgs) Handles bnStart.Click
        sw.Restart()
        tim.Enabled = True

    End Sub

    Private Sub bnStop_Click(sender As Object, e As EventArgs) Handles bnStop.Click
        sw.Stop()
        tim.Enabled = False
        ShowElapsedTime()

    End Sub

    Private Sub bnReset_Click(sender As Object, e As EventArgs) Handles bnReset.Click
        tim.Enabled = False
        sw.Reset()
        ShowElapsedTime()

    End Sub

    Private Sub tim_Tick(sender As Object, e As EventArgs)
        ShowElapsedTime()

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        tim = New Timer With {.Interval = 50}
        AddHandler tim.Tick, AddressOf tim_Tick
        ShowElapsedTime()

    End Sub

End Class

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多