2016-11-15 8 views
1

Ich habe eine App, die eine System.Windows.Forms.Timer verwendet und sehe Probleme mit dem Timer-Intervall. Wenn ich ein Intervall von 1000 für eine Dauer von 180 Sekunden verwende, ist die verstrichene Zeit konsistent um 183 Sekunden. Wenn ich ein Intervall von 995 verwende, ist die verstrichene Zeit genau (d. H. 180 Sekunden). Ich habe das auf 3 verschiedenen PCs mit den gleichen Ergebnissen auf jedem versucht. Der folgende Code verwendet 2 Textfelder, um die Start- und Endzeiten und eine Bezeichnung als Countdown-Timer anzuzeigen.Winforms Timer nicht genau

Kann jemand dieses Verhalten erklären?

Public Class Form1 

Private WithEvents tmr As New System.Windows.Forms.Timer 

Private Duration As Integer = 180 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    RunTimer() 
End Sub 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    lblActivityTimer.Text = FormatCounter(Duration) 
    tmr.Interval = 1000 

End Sub 

Private Sub RunTimer() 

    tmr.Start() 
    TextBox1.Text = Now.ToString() 

End Sub 

Private Function FormatCounter(sec As Integer) As String 

    Dim Hours, Minutes, Seconds As Integer 

    Hours = sec \ 3600 
    Seconds = sec Mod 3600 
    Minutes = Seconds \ 60 
    Seconds = sec Mod 60 

    FormatCounter = Hours.ToString.PadLeft(2, "0"c) & ":" _ 
                & Minutes.ToString.PadLeft(2, "0"c) _ 
                & ":" _ 
                & Seconds.ToString.PadLeft(2, "0"c) 

End Function 

Private Sub tmr_Tick(sender As Object, e As EventArgs) Handles tmr.Tick 

    Duration -= 1 
    lblActivityTimer.Text = FormatCounter(Duration) 
    If Duration = 0 Then 
     TextBox2.Text = Now.ToString() 
     tmr.Stop() 
    End If 

End Sub 

End Class 
+1

Es ist keine hohe Präzision Timer - so weit aus seinem wenn die Zecke Ereignisse in Priorität tatsächlich ziemlich niedrig Rang, so dass sie nach gut passieren können, wenn man – Plutonix

+0

erwarten Sie müssen ein gutes Stück in Ihrer Anwendung tun. Es ist normalerweise nur ein paar Millisekunden zu spät, also sollte in weniger als einem zweiten Unterschied in 3 Minuten sein. Der Multimedia-Timer ist das Beste, was Sie für Präzision tun können. Hier ist ein Beispiel http://www.vbforums.com/showthread.php?837913-MicroTimer-Resource-Friendly-Accurate-Timer – topshot

+0

Ich führe nur den Code oben ... nichts anderes. Es ist konsistent ungenau mit einem Intervall von 1000 und konsistent genau mit einem Intervall von 995. – JHH

Antwort

-1

Es gibt zwei leicht verfügbaren Timer-Objekt Alternativen:

  • System.Threading.Timer (erklärt here, meine erste Wahl)
  • System.Timers.Timer (erklärt here)
0

ein Stop Watch verwenden, es bietet eine Reihe von Methoden und Eigenschaften, mit denen Sie die verstrichene Zeit genau messen können.

Shared Sub Main(ByVal args() As String) 
    Dim stopWatch As New Stopwatch() 
    stopWatch.Start() 
    Thread.Sleep(10000) 
    stopWatch.Stop() 
    ' Get the elapsed time as a TimeSpan value. 
    Dim ts As TimeSpan = stopWatch.Elapsed 

    ' Format and display the TimeSpan value. 
    Dim elapsedTime As String = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds/10) 
    Console.WriteLine("RunTime " + elapsedTime) 

End Sub 'Main