使用VB.NET的StopWatch循环

Nov*_*and 4 vb.net time stopwatch

我想使用VB.NET使用此接口创建一个简单的计时器

在此处输入图片说明

我想按Button1并开始计算文本框中的秒数。

我不想使用计时器组件,因为它不提供高分辨率。

因此,我决定使用秒表类,因为它具有符合规格的高分辨率。

但是根据我下面的VB.NET代码,在我看来,整个“ dotnet冒险”是不可能的。那是因为当我按下Button1时,它的整个窗体都会冻结,并且我无法按下Button2来停止计时器。

我的代码有什么问题吗?我应该怎么做才能拥有上述功能?

提前致谢!

 
公开课表格1

Private 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

Run Code Online (Sandbox Code Playgroud)

最终班

And*_*eas 5

在WinForms中,有一个UI线程执行消息循环。基本上,每个事件都被添加到消息队列中,然后依次处理。当Button1被点击时,该Button1_Click方法被执行并且没有其他事件将被处理,直到它完成。由于需要Button2.Click处理您的设计才能终止循环Button1.Click,因此它将永远不会终止。

为了正确实现所需的功能,您必须启动秒表Button1.Click,并将UI更新逻辑放入Tick放置在窗体上的计时器事件中。


Idl*_*ind 5

您正在“浪费”时间,因为您要手动添加时间范围:enableTime = enableTime + TimeSpan.FromSeconds(1)。当您使用Stopwatch()Stopwatch.Elapsed属性时,它本身总是准确的。您需要做的就是从Timer.Tick事件中更新GUI 。基本上,计时器只是问秒表当前时间是多少,并显示它……不需要任何计算。

以下内容将每秒更新十次,不会“漂移”,也不会钉住CPU:

Public Class Form1

    Private SW As New Stopwatch
    Private WithEvents Tmr As New System.Windows.Forms.Timer

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Tmr.Interval = 100
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        SW.Start()
        Tmr.Start()
    End Sub

    Private Sub Tmr_Tick(sender As Object, e As System.EventArgs) Handles Tmr.Tick
        TextBox1.Text = SW.Elapsed.ToString
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        SW.Stop()
        Tmr.Stop()
        SW.Reset()
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)