仅显示秒表中的相关数字

时间:2015-09-16 22:57:46

标签: vb.net winforms

在尝试制作秒表时,我注意到它会显示与计时器相关的所有数字组(在本例中为#34; 00:00:00:00")

为了只显示相关的数字,而不是在一分钟没有通过时显示分钟栏,我想出了这段代码:

Public Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim sw As New Stopwatch
    Dim elapsed As TimeSpan = Me.stopwatch.Elapsed
    Label1.Text = String.Format("{0:00}:{1:00}",
                  Math.Floor(elapsed.Seconds),
                  elapsed.Milliseconds)
    If Label1.Text = "60:999" Then
        Label1.Text = String.Format("{0:00}:{1:00}:{2:00}",
                      Math.Floor(elapsed.Minutes),
                      elapsed.TotalSeconds, elapsed.TotalMilliseconds)
    End If
End Sub

当此代码处于活动状态时,计时器将仅显示秒和毫秒列,直到它达到整分钟,在这种情况下,它将循环回到0秒并重复。我假设计时器无法准确检测到label1的文本何时正好60.999,但我不确定。我缺少什么逻辑?

2 个答案:

答案 0 :(得分:2)

定时器不能保证在它们的间隔内完全发射。我假设您的计时器设置为每1ms关闭一次,但是当您运行程序时,您可能会发现它可能会因为每3-16ms有很多抖动而被提升,这也没有帮助事实上,WinForms Timer(我假设你正在使用它)通过Win32窗口消息泵,而不是它自己的专用(和实时)线程。

无论如何,修复是不比较字符串,而是比较实际时间值:

If elapsed.TotalSeconds < 60 Then
    label1.Text = String.Format("{0:00}:{1:00}", Math.Floor(elapsed.Seconds), elapsed.Miliseconds)
Else
    label1.Text = String.Format("{0:00}:{1:00}:{2:00}", Math.Floor(elapsed.TotalMinutes), Math.Floor(elapsed.Seconds), elapsed.Miliseconds)
End If

请注意,如果您已经显示TotalSeconds,则不应显示Minutes

答案 1 :(得分:0)

您的代码存在一些问题:

  1. 您要在Stopwatch事件的内声明新的Tick 。这是不必要的。
  2. 你正在使用字符串比较做一些应该用数学做的事情。你的预感是正确的,标签的文字是&#34; 60:999&#34;正在被计时器错过。
  3. 不要比较标签的文本值,只需看看已经过了多少毫秒(或秒)!

    Public Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim elapsed As TimeSpan = Me.stopwatch.Elapsed
    
        If elapsed.TotalSeconds >= 60 Then
            Label1.Text = String.Format("{0:00}:{1:00}:{2:00}",
                Math.Floor(elapsed.Minutes),
                Math.Floor(elapsed.Seconds), 
                elapsed.Milliseconds)
        Else
            Label1.Text = String.Format("{0:00}:{1:00}",
                Math.Floor(elapsed.Seconds),
                elapsed.Milliseconds)
        End If
    End Sub