在尝试制作秒表时,我注意到它会显示与计时器相关的所有数字组(在本例中为#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
,但我不确定。我缺少什么逻辑?
答案 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)
您的代码存在一些问题:
Stopwatch
事件的内声明新的Tick
。这是不必要的。不要比较标签的文本值,只需看看已经过了多少毫秒(或秒)!
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