Anfängerfrage - TimeSpan vergleichen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Anfängerfrage - TimeSpan vergleichen

    Hallo,

    ich bin absoluter Anfänger mit VB.NET. Jetzt zu meiner Frage: Ich habe mir eine simple Stopwatch gebaut. Diese funktioniert auch. Nun möchte ich das z.b wenn die stopwatch läuft, das nach einer gewissen zeit eine Messagebox z.b aufgeht und fragt, ob wirklich noch was gemacht wird.

    Nur wie kann ich z.b. die die aktuelle laufende zeit mit einem festem Wert vergleichen?? Ich muss ja jetzt der Variablen "zeitende" einen Wert zum vergleichen übergeben. Nur wie genau muss das geschrieben werden? Z.b soll nach 2 Minuten das Messagebox aufgehen.

    Hier mein Timer und mein Versuch:

    Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Dim elapsed As TimeSpan = Me.StopWatch.Elapsed
    3. Dim zeitende As TimeSpan
    4. Label1.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:00}", _
    5. Math.Floor(elapsed.TotalHours), _
    6. elapsed.Minutes, elapsed.Seconds, _
    7. elapsed.Milliseconds)
    8. If (elapsed = zeitende) Then
    9. MessageBox.Show("2 rum")
    10. End If
    11. End Sub


    Gruß

    Andre
    Du müsstest zeitende außerhalb der Sub deklarieren und beim Start des Timers deine 2 Minuten (DateTime.Now + TimeSpan.FromMinutes(2)) zuweisen. Außerdemist das Ende deiner 2 Minuten ja kein Zeitraum sondern eine Uhrzeit -> ​DateTime. Ungefähr so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(...)
    2. Ende = DateTime.Now + TimeSpan.FromMinutes(2) 'Jetzt + 2 Minuten
    3. Timer1.Start()
    4. End Sub
    5. Private Ende As DateTime
    6. Private Sub Timer1_Tick(...)
    7. If (DateTime.Now >= Ende) 'Prüfen ob der jetzige Zeitpunkt später oder gleich der gespeicherten Zielzeit ist.
    8. MessageBox.Show("2 Minuten vorbei")
    9. Timer1.Stop() 'Timer stoppen damit die Messagebox nicht gespammt wird.
    10. End If
    11. End Sub
    Hi,

    danke für die schnelle Antwort. Ich habe es jetzt so gelöst. Nun kommt aber das nächste Problem. Bei einer bestimmten zeit wird jetzt der Timer gestoppt, eine MessageBox geöffnet und gefragt, ob der Timer weiter laufen soll. Sobald ich auf Ja klicke, wird immer wieder die selbe MessageBox geöffnet.

    Quellcode

    1. If (timer_zeit = zeitende) Then
    2. Timer1.Stop()
    3. Me.StopWatch.Stop()
    4. Button4.Enabled = True
    5. Dim result As Integer = MessageBox.Show("Ihr Timer läuft seit 2 Stunden, möchten Sie weiter machen?", "caption", MessageBoxButtons.YesNoCancel)
    6. If result = DialogResult.Cancel Then
    7. MessageBox.Show("Cancel pressed")
    8. ElseIf result = DialogResult.No Then
    9. MessageBox.Show("No pressed")
    10. ElseIf result = DialogResult.Yes Then
    11. Timer1.Start()
    12. Me.StopWatch.Start()
    13. Button4.Enabled = False
    14. MessageBox.Show("Yes pressed")
    15. End If
    16. End If
    Hier der ganze Code. Wie gesagt, mein Problem ist, wenn man in der MessageBox auf Ja klickt, soll der Counter einfach weiter laufen. Jetzt wird dann immer wieder die Messagebox aufgerufen und der Counter läuft nicht weiter.

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Dim elapsed As TimeSpan = Me.StopWatch.Elapsed
    3. Dim zeitende As String = "00:00:03"
    4. Dim timer_zeit As String = String.Format("{0:00}:{1:00}:{2:00}", _
    5. Math.Floor(elapsed.TotalHours), _
    6. elapsed.Minutes, elapsed.Seconds, _
    7. elapsed.Milliseconds)
    8. Label1.Text = String.Format("{0:00}:{1:00}:{2:00}", _
    9. Math.Floor(elapsed.TotalHours), _
    10. elapsed.Minutes, elapsed.Seconds, _
    11. elapsed.Milliseconds)
    12. If (timer_zeit = zeitende) Then
    13. Timer1.Stop()
    14. Me.StopWatch.Stop()
    15. Button4.Enabled = True
    16. Dim result As Integer = MessageBox.Show("Ihr Timer läuft seit 2 Stunden, möchten Sie weiter machen?", "caption", MessageBoxButtons.YesNoCancel)
    17. If result = DialogResult.Cancel Then
    18. MessageBox.Show("Cancel pressed")
    19. ElseIf result = DialogResult.No Then
    20. MessageBox.Show("No pressed")
    21. ElseIf result = DialogResult.Yes Then
    22. Label2.Text = timer_zeit
    23. Timer1.Start()
    24. Me.StopWatch.Restart()
    25. End If
    26. End If
    27. End Sub
    ah - nu kann ich dein Code ordentlich lesen - aber wie so oft ist in post#2 bereits alles gesagt:
    Schmeiß die StopWatch weg, und bestimme keinen Timespan, sondern ein ZeitEnde, Typ DateTime, und bestimme das ZeitEnde nicht im TimerTick, sondern im ButtonClick, der im weiteren den Timer auch startet - steht alles in post#2.
    Und wenn du im TimerTick beim zeit-Ablauf einen Restart machen willst (uih - das steht nicht in post#2!) - dann mach das halt - meinst du, du kriegst das hin?
    Hi,

    danke. Ich werde es nachher mal ausprobieren. Warum gibt es den die Stopwatch? Die macht doch eigentlich was ich möchte. Ich denke ich muss das umdenken erstmal drin haben. Komme aus der Webentwicklung. ;) Würdest Du mir trotzdem kurz erklären, warum bei meinem Code nach dem Restart immer wieder die Messagebox aufgerufen wird? Nur damit ich das verstehe.
    jo, prinzipiell gehts auch mitte Stopwatch. Aber das vereinfacht nichts, weil wenn du mit Stopwatch die Zeitspanne (dann ist es eine TimeSpan) misst, brauchst du ebenso eine Merkvariable, die das ZeitEnde sich merkt.

    Also mit Stopwatch brauchst du die Stopwatch + eine Merkvariable vom Typ Timespan, und ohne Stopwatch brauchst du nur eine Merkvariable, vom Typ DateTime.
    Die Entscheidung bei solchen Fragen ist inne Programmierung erfreulicherweise einfach: Man nimmt immer das Einfachere :)
    Ok aber warum wird die MessageBox immer wieder aufgerufen? Weil der Counter dann immer noch auf 3 Sekunden steht? Also müsste ich zu dem aktuellen TimeSpan dann eine Sekunde dazu addieren, wenn ich auf restart klicke, richtig?
    tja, deinen Code guck ich eiglich garnet wirklich an, weil wenn ich sowas schon sehe:

    VB.NET-Quellcode

    1. Dim timer_zeit As String = String.Format("{0:00}:{1:00}:{2:00}", _
    2. Math.Floor(elapsed.TotalHours), _
    3. elapsed.Minutes, elapsed.Seconds, _
    4. elapsed.Milliseconds)
    schalte ich ein stückweit ab.
    timer_zeit ist gar keine Zeitspanne (Timespan), sondern ist ein String (also Text).
    Das kann man jetzt genauer untersuchen, warum dieser String nicht identisch sein will mit irgendeinem anderen String, aber das kann man auch lassen, und zurückverweisen auf den Thread-Titel: "TimeSpan vergleichen".
    Also wenn du Zeitspannen vergleichen willst, vergleiche Timespans, keine Strings.
    (Und wenn du Zeitpunkte vergleichen willst (was hier sinnvoll wäre), vergleiche DateTimes, keine Strings)

    Und dein Vergleich soll nicht auf Gleichheit testen (=), sondern natürlich musst du auf Überschreitung des Merk-Wertes testen: >.
    Alles in post#2 gezeigt.

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

    also ich rate sehr ab von so Schmuddel-Sites, wo nach paar Sekunden Reklame aufpoppt.
    Du kannst davon ausgehen, dass die dich tracken - Tracken?: DoNotTrack

    ich würd dich auch bitten, solche Sites nicht zu verlinken.

    paar generelle Tipps:
    • Tuts, die die Sources nicht beiliegen haben, würde ich nur dann überhaupt eines Blickes würdigen, wenn das Thema nicht direkt Code behandelt (sondern etwa Strategien, Tool-Bedienung etc.)
      Insbesonder YouTube-Tuts sind zu 99% grauenhafter Müll
    • Wenn Sources beiliegen, als erstes überprüfen, ob die Empfohlene Einstellungen umgesetzt sind
      Falls nicht: vergisses - der Autor ist ein Script-Kiddie ohne nennenswerte Grundkenntnisse. Von dem kannst du allenfalls schlechte Gewohnheiten lernen (siehste ja: du wolltest Zeiten mit Strings vergleichen), und schlechte Gewohnheiten sind wie ComputerViren: ein Kontakt, einmal funktioniert es, und schon reproduziert man den Mist, bis man iwann dann vlt. doch vor die Wand fährt, aber dann ists Titanen-Arbeit, die schlechte gegen eine gute Gewohnheit auszutauschen, und evtl. hunderte Code-Stellen, verteilt in vlt. vielen Projekten, zu korrigieren.
    • VBP hat doch einen fabelhaften Tutorial-Bereich :)
    • und hat auch eine Bücherliste