Stoppuhr & Countdown

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von TVX.

    Stoppuhr & Countdown

    Hallo Zusammen

    Ich habe eine Stoppuhr gemacht mit einem Timer (100 Interval)

    Wenn milisekunden = 10 -> Sekunden +1
    Wenn Sekunden = 59 -> Minuten +1
    Wenn Minuten = 59 -> Stunden +1

    Nach 2 Minuten habe ich eine abweichung von3-4 Sekunden.

    Wie kann ich eine genaue Stoppuhr programmieren? Kann man vielleicht die System Zeit dafür verwenden?

    Mfg Lingo
    Falscher Ansatz... Der Timer dient NICHT dazu, die Zeit zu messen, sondern nur dazu, die Messung DURCHZUFÜHREN!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents tm As New Timer With {.Enabled = False, .Interval = 100}
    3. Private CountdownValue As Integer = 10
    4. Private Startzeit As DateTime
    5. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. Me.Label1.Text = "Press Button To Start"
    7. End Sub
    8. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    9. If tm.Enabled Then Exit Sub
    10. Me.Label1.Text = CountdownValue.ToString
    11. Startzeit = Now
    12. tm.Enabled = True
    13. End Sub
    14. Private Sub tm_Tick(sender As Object, e As System.EventArgs) Handles tm.Tick
    15. Dim elapsed = TimeSpan.FromTicks(Now.Ticks - Startzeit.Ticks).Seconds
    16. If CountdownValue - elapsed <= 0 Then
    17. tm.Enabled = False
    18. Me.Label1.Text = "Press Button To Start"
    19. Debug.Print("Elapsed: {0} ms", TimeSpan.FromTicks(Now.Ticks - Startzeit.Ticks))
    20. Else
    21. If Me.Label1.Text <> (CountdownValue - elapsed).ToString Then
    22. Me.Label1.Text = (CountdownValue - elapsed).ToString
    23. Debug.Print("Elapsed: {0} ms", TimeSpan.FromTicks(Now.Ticks - Startzeit.Ticks))
    24. End If
    25. End If
    26. End Sub
    27. End Class


    [VB.NET] Simpler Countdown - alle Timer extrem ungenau

    Nimm lieber gleich Stopwatch

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „programmer71“ ()

    Bitte kurz und kompakt :) :

    VB.NET-Quellcode

    1. 'Imports System.Threading
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. watch.Start()
    5. End Sub
    6. Public watch As New Stopwatch
    7. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    8. Label1.Text = watch.ElapsedMilliseconds.ToString
    9. End Sub
    10. End Class

    8-) faxe1008 8-)
    Ah ich verstehe.
    Sehr schön werde nun versuchen das ganze in Stunden/Minuten/Sekunden anzeigen zu lassen ...

    EDIT:

    Eine kurze Frage noch.
    Ist es unschön wenn ich mit einer if abfrage schaue ob die milisekunden auf 1000 sind und somit sekunde = 1 mache?

    Lingo schrieb:

    Ist es unschön wenn ich
    Ja, das macht StopWatch für Dich, wenn Du die Ausgabe entsprechend formatierst:

    VB.NET-Quellcode

    1. Label1.Text = watch.ElapsedMilliseconds.ToString
    2. Label2.Text = watch.Elapsed.ToString
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry für den Doppelpost aber ich erstelle einen neuen Beitrag damit das Thema wieder als neu gewertet wird.


    Ich habe nun einige Zeit investiert einen Countdown zu basteln der keine Abweichung hat.
    Ich bin eigentlich nicht auf etwas gescheites gestossen. Hab jetzt nun mal auf msdn.microsoft nachgeschaut und das Beispiel dort ist auch einfach mit einem Timer (Interval 1000) und Label runter zählen.

    VB.NET-Quellcode

    1. If timeLeft > 0 Then
    2. ' Display the new time left
    3. ' by updating the Time Left label.
    4. timeLeft -= 1
    5. timeLabel.Text = timeLeft & " seconds"
    6. Else


    Soll ich das nun so machen oder hat jemand gerade eine Blitzidee.

    Mein konkretes Ziel:

    - Auf Form 2 wird per "NumericOpDown" die Zeit (Stunden/Min/sec) eingegeben.
    - Diese Zeit soll auf der Form1 in 3 entsprechenden Labels auf 0 herunter gezählt werden.

    Mfg
    also hier ein Timer_Tick, wo den Timer immer neu einstellt, wenn Abweichungen vorliegen

    VB.NET-Quellcode

    1. Private Const _Interval As Integer = 3000
    2. Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
    3. Const Fullsecond As Integer = 1000
    4. Dim dt = Now
    5. Dim NewInterval = -dt.Millisecond
    6. If NewInterval < -500 Then NewInterval += Fullsecond
    7. NewInterval += _Interval
    8. Debug.WriteLine(String.Concat("Timer1.Tick ", dt.ToString("mm:ss:ffff"), " ", NewInterval))
    9. If Timer1.Interval = NewInterval Then Return
    10. Timer1.Interval = NewInterval
    11. End Sub
    Super-genau geht nicht, dafür bräuchte man spezielle Hardware.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private WithEvents _t2 As New Timer With {.Interval = 1000}
    4. Private zeit As TimeSpan = TimeSpan.FromHours(2) 'hier ändern min sec usw
    5. Private countdown As TimeSpan
    6. Private watch As New Stopwatch
    7. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    8. _t2.Start()
    9. watch.Start()
    10. End Sub
    11. Private Sub _t2_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles _t2.Tick
    12. countdown = zeit - watch.Elapsed
    13. Label1.Text = CStr(countdown.Hours)
    14. Label2.Text = CStr(countdown.Minutes)
    15. Label3.Text = CStr(countdown.Seconds)
    16. End Sub
    17. End Class


    ErfinderDesRades - Moderator - Notiz: nanu? Der Thread ist doch seit ca. 2 Wochen erledigt.
    --> closed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()