【发布时间】:2013-05-05 23:13:04
【问题描述】:
我想用 VB.NET 用这个接口创建一个简单的计时器
我想按下 Button1 并开始在文本框中计算秒数。
I do not want to use the Timer Component because it does not offer high resolution.
因此,我决定使用 stopWatch 类,因为它根据规范具有高分辨率。
但根据我下面的 VB.NET 代码,在我看来,整个“dotnet 冒险”是不可能的。那是因为当我按下 Button1 时,它会冻结整个表单,我无法按下 Button2 来停止计时器。
我的代码有什么问题吗? 我应该怎么做才能拥有上述功能?
提前致谢!
公开课形式1Private enableTime As TimeSpan
Private stopWatch As New Stopwatch()
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
stopWatch.Start()
If stopWatch.IsHighResolution Then
Do
If stopWatch.ElapsedTicks.Equals(TimeSpan.TicksPerSecond) Then
enableTime = enableTime + TimeSpan.FromSeconds(1)
TextBox1.Text = enableTime.ToString
stopWatch.Restart()
End If
If Not stopWatch.IsRunning Then
Exit Do
End If
Loop
End If
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
stopWatch.Stop()
stopWatch.Reset()
End Sub
结束类
【问题讨论】:
-
即使您能弄清楚线程和 UI 更新,您仍然无法获得您想要的分辨率。看看你是如何检查
stopWatch.ElapsedTicks.Equals(TimeSpan.TicksPerSecond)的?那可能永远不会是真的。当您的循环运行时,这些刻度会从您下方滑出——您不会全部看到它们。即使你这样做了,当你重新启动计时器时,你也会失去更多的分辨率。漂移是不可避免的。这不是 .NET 的问题,它是计算机的基本功能(至少是您正在使用的计算机)。 -
在我自己的观点中,我在上面的主要概念中错过的分辨率是很小的纳秒数,因此分辨率尽可能好。但我承认我可能错了!
-
你想要的分辨率有什么意义?只是为了让您不会像链接问题中的人那样“错过”一秒钟吗?还是你真的需要一堆小数位?
-
我希望它是一个商业项目,所以它必须有尽可能好的分辨率。
-
你的商业产品可以接受CPU吗?即使使用后台线程,您的解决方案也将始终运行,这意味着处理器永远不会休息(如果适用,电池寿命也会受到影响)。在这种情况下可能没问题,但只是想确保您意识到这一点。