TIMER或STOPWATCH在visual basic 2010中
问题描述:
我有一个虚拟软件来测试秒表在Visual Basic中的精确度。我被告知Visual Basic有一个很好的时机,但我正在经历一些奇怪的行为。TIMER或STOPWATCH在visual basic 2010中
这全是我的代码:
Imports System.IO
Public Class Form1
Public tmrTime As New Stopwatch
Dim currentDate As Date
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
tmrTime.Start()
End Sub
Private Sub Form1_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
TextBox1.Text = (tmrTime.ElapsedTicks/Stopwatch.Frequency) * 1000
End Sub
Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
TextBox2.Text = (tmrTime.ElapsedTicks/Stopwatch.Frequency) * 1000
End Sub
End Class
问题对,如果我拿两个文本框的非小数部分(这是迫切和ABS释放的时间的绝对时间)。他们几乎总是耦合在一起,即两者都是奇数或偶数。
你知道发生了什么?
我使用tmrTime.ElapsedMilliseconds或tmrTime.Elapsed.Ticks有同样的结果: - \
答
有有关.NET中的秒表/定时器精度这里on a MSDN blog好文章。如果我理解正确,你想做的事,这应该解决您的问题:
Public Class Form1
Private _sw As New Stopwatch
Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
_sw.Start()
End Sub
Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
Dim elapsed As Long
elapsed = _sw.ElapsedTicks
_sw.Stop()
tbTicks.Text = (elapsed/Stopwatch.Frequency) * 1000
_sw.Reset()
End Sub
End Class
答
从乔治发布的代码需要升级:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.KeyPreview = True
End Sub
肯定。代码中的基本缺陷是,当您按下/释放按键时,您不会测量事件处理程序何时开始运行。它由Windows中的调度算法来管理,代码运行在非常规律的心跳上。 – 2013-02-27 18:34:33
谢谢,但是有什么方法可以衡量按键何时被按下/释放? – Vaaal88 2013-02-27 20:43:44
你必须调用GetLastInputInfo()。但是这是毫无意义的,消息时间戳的准确性只有16毫秒,并不比现在好。有很少的情况下,这是一个真正的问题。 – 2013-02-27 20:57:39