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有同样的结果: - \

+2

肯定。代码中的基本缺陷是,当您按下/释放按键时,您不会测量事件处理程序何时开始运行。它由Windows中的调度算法来管理,代码运行在非常规律的心跳上。 – 2013-02-27 18:34:33

+0

谢谢,但是有什么方法可以衡量按键何时被按下/释放? – Vaaal88 2013-02-27 20:43:44

+0

你必须调用GetLastInputInfo()。但是这是毫无意义的,消息时间戳的准确性只有16毫秒,并不比现在好。有很少的情况下,这是一个真正的问题。 – 2013-02-27 20:57:39

有有关.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