2013-02-27 63 views
0

我有一個虛擬軟件來測試秒錶在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

回答

1

有有關.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 
0

從喬治發佈的代碼需要升級:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Me.KeyPreview = True 
End Sub