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)
最终班
在WinForms中,有一个UI线程执行消息循环。基本上,每个事件都被添加到消息队列中,然后依次处理。当Button1被点击时,该Button1_Click方法被执行并且没有其他事件将被处理,直到它完成。由于需要Button2.Click处理您的设计才能终止循环Button1.Click,因此它将永远不会终止。
为了正确实现所需的功能,您必须启动秒表Button1.Click,并将UI更新逻辑放入Tick放置在窗体上的计时器事件中。
您正在“浪费”时间,因为您要手动添加时间范围: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)
| 归档时间: |
|
| 查看次数: |
10564 次 |
| 最近记录: |