VB.NET Sleep Timer
Inhaltsverzeichnis
VB.NET Sleep Timer
Du möchtest mit einem VB.NET Sleep Timer Code verzögert ausführen, oder ggf. die Ausführung eines Timers etwas verzögern?
Schön, dass Du diesen Beitrag und somit zu mir gefunden hast, denn hier lernst Du genau das 😉!
Eventuell interessierst Du Dich ja auch noch für folgende Beiträge: VB.NET Timer Countdown, VB.NET Timer zur Laufzeit erstellen, oder auch ein einfaches VB.NET Timer Beispiel.
Szenarien
Im Folgenden Abschnitt, bzw. in den zwei Teilen, erkläre ich die zwei Themen, Welche wir hier behandeln werden.
Timer als Sleep-Funktion benutzen
Im ersten kleinen Teil erkläre ich Dir, wie man einen Timer als Sleep-Funktion verwenden kann.
Das heißt, wir starten den Timer, lassen Ihn ein wenig warten und anschließend den Code unserer Begierde ausführen.
Sei Dir jedoch darüber bewusst, dass das nicht unbedingt die beste Variante ist, diese Problemstellung anzugehen.
Da Du allerdings genau nach dieser Problemstellung gesucht hast, erkläre ich Dir wie Du hier vorgehen könntest, um dein Ziel zu erreichen.
Timer warten lassen
Das nächste Szenario, Welches ich mir bei deiner gewählten Recherche vorstellen könnte wäre, dass Du einen Timer ggf. eine gewisse Zeit warten lassen möchtest.
Wir starten also den Timer, lassen Ihn eine beliebige Zeit laufen und können Ihn dann zu einer gewissen Zeit den nächsten „Tick“ pausieren kannst.
Auch hier gebe ich Dir den Hinweis, dass man wirklich überlegen müsste, ob es je nach Szenario der richtige Ansatz ist.
Timer als Sleep-Funktion
Für das erste Beispiel kannst Du Dir eine ungefähre grafische Oberfläche wie die Kommende hier inkl. einem Timer zusammenklicken.
Den Intervall des Timers kannst Du auf z. B. 3000 Millisekunden, also 3 Sekunden stellen und ansonsten brauchst Du nichts anrühren.
Die Textbox kannst Du getrost als Readonly definieren und auch ggf. auf Multline stellen.
Generiere Dir anschließend einen Klick–Ereignishandler für den Button und wechsle in Diesen.
Private Sub btnSleepTimer1_Click(sender As Object, e As EventArgs) Handles btnSleepTimer1.Click tbTimerOne.Text = "started, waiting for timer tick" tmrSleep1.Start() End Sub
Der obige Code setzt letztendlich zu Demonstrationszwecken einen initialen Text in die Textbox.
Danach kannst Du Dir einen Tick-Ereignishandler generieren und mit folgenden Code befüllen:
Private Sub tmrSleep1_Tick(sender As Object, e As EventArgs) Handles tmrSleep1.Tick StopAfterFirstTick() tbTimerOne.Text = $"{tmrSleep1.Interval}ms passed, yay" End Sub
Da ich ein Freund von Robert C. Martins Ansicht „Code muss sich wie ein gutes Buch lesen..“ bin, habe ich die erste Funktionalität des Tick-Handlers in eine passend bezeichnete Methode ausgelagert:
Private Sub StopAfterFirstTick() tmrSleep1.Stop() End Sub
Fertig
Wenn Du das bezeichnete Beispiel ausführst, wird die Textbox ihren Text initial bekommen und nach dem gewählten Intervall ihren Text ändern.
Ebenso wird der Timer aufgrund des Stops keine weiteren Tick-Ereignisse auslösen und der Code somit nur einmal ausgeführt.
Timer warten lassen
Das zweite Beispiel lässt einen Timer während der Ausführung ein wenig warten, bzw. zwischen den Tick-Ereignissen pausieren.
Für dieses Beispiel könntest Du folgende GUI bestehend aus einem Label, einer Textbox und 3 Buttons zusammenklicken:
Lege Dir auch hier einen Timer auf die Form, benenne ihn z. B. als „tmrSleep2“ und stelle den Intervall auf beispielsweise 1000ms, also 1 Sekunde.
Lass die restlichen Eigenschaften des hinzugefügten Timers unangetastet und fahre fort.
Lege nun ein neues Feld, oder eine neue Eigenschaft in der Form an, um später im Tick-Ereignishandler darauf zugreifen und bei Bedarf warten zu können.
Private Property DelaySecondTimer As Boolean
Generiere anschließend die 3 Klick-Ereignishandler für die Buttons:
In diesem ersten Handler hier starten wir den Timer.
Private Sub btnStartTimerTwo_Click(sender As Object, e As EventArgs) Handles btnStartTimerTwo.Click tmrSleep2.Start() End Sub
Wenn der Knopf zur Verzögerung geklickt wird, wird unser Flag auf „True“ gestellt und gleich im Tick-Ereignishandler verarbeitet.
Private Sub btnDelayTimerTwoOnce_Click(sender As Object, e As EventArgs) Handles btnDelayTimerTwoOnce.Click DelaySecondTimer = True End Sub
Bei dem letzten Knopf stoppen wir letztendlich nur den Timer.
Private Sub btnStopSecondTimer_Click(sender As Object, e As EventArgs) Handles btnStopSecondTimer.Click tmrSleep2.Stop() End Sub
Der Tick-Ereignishandler des Timers:
Private Sub tmrSleep2_Tick(sender As Object, e As EventArgs) Handles tmrSleep2.Tick If DelaySecondTimer Then tbTimerTwo.AppendText($"ok, skip this tick{Environment.NewLine}") DelaySecondTimer = False Return End If tbTimerTwo.AppendText($"Tick{Environment.NewLine}") End Sub
Im ersten Schritt des Handlers prüfen wir, ob das Flag für die Verzögerung, bzw. die Pause vorher gesetzt wurde.
Falls das Flag gesetzt wurde, geben wir dies in der Textbox aus und setzen das Flag wieder auf „False“ zurück.
Danach verlassen wir die Sub durch „Early Return“.
Wenn das Flag nicht gesetzt ist, geben wir praktisch eine neue Log-Zeile in der Textbox aus.
Kompletter Code – VB.NET Sleep Timer
Public Class Form1 ' Sample 1 Private Sub btnSleepTimer1_Click(sender As Object, e As EventArgs) Handles btnSleepTimer1.Click tbTimerOne.Text = "started, waiting for timer tick" tmrSleep1.Start() End Sub Private Sub tmrSleep1_Tick(sender As Object, e As EventArgs) Handles tmrSleep1.Tick StopAfterFirstTick() tbTimerOne.Text = $"{tmrSleep1.Interval}ms passed, yay" End Sub Private Sub StopAfterFirstTick() tmrSleep1.Stop() End Sub ' Sample 2 Private Property DelaySecondTimer As Boolean Private Sub btnStartTimerTwo_Click(sender As Object, e As EventArgs) Handles btnStartTimerTwo.Click tmrSleep2.Start() End Sub Private Sub btnDelayTimerTwoOnce_Click(sender As Object, e As EventArgs) Handles btnDelayTimerTwoOnce.Click DelaySecondTimer = True End Sub Private Sub btnStopSecondTimer_Click(sender As Object, e As EventArgs) Handles btnStopSecondTimer.Click tmrSleep2.Stop() End Sub Private Sub tmrSleep2_Tick(sender As Object, e As EventArgs) Handles tmrSleep2.Tick If DelaySecondTimer Then tbTimerTwo.AppendText($"ok, skip this tick{Environment.NewLine}") DelaySecondTimer = False Return End If tbTimerTwo.AppendText($"Tick{Environment.NewLine}") End Sub End Class