VB.NET Timer Beispiel

VB.NET Timer Beispiel
VB.NET Timer Beispiel – Code im Intervall ausführen

VB.NET Timer Beispiel – Code im Intervall ausführen

In diesem Beitrag zeige ich ein einfach zu verstehendes VB.NET Timer Beispiel.

Vor allem bei Anfängern ist der Timer ein sehr beliebtes Steuerelement, da er einmal auf die Form gezogen, sehr einfach mit Code zu versehen ist.

Es gibt allerdings auch beim einfachen Timer-Steuerelement einige Sachen zu beachten, sonst stehen eventuell Kopfschmerzen bevor.

Wer sich bereits mit dem Timer an sich auskennt, aber zum Beispiel Schwierigkeiten hat, den Timer zur Laufzeit zu erstellen und mit Code zu versehen, kann sich diesen Beitrag anschauen.

Der Zweck des Timers

Die Frage die man sich vermutlich zuerst stellt ist, welchen Sinn ein Timer überhaupt hat und warum man ein Control dafür braucht?

Code im Intervall ausführen

Jeder kommt in seinem Programmierer-Dasein glaube ich an den Punkt, dass er Code gerne in gewissen Zeitabständen immer wieder ausführen lassen möchte.

Anders gesagt, möchte man seinen Code eventuell timen – höhö 😉 und sucht nach der passenden Möglichkeit!

Die erste Anlaufstelle die man finden wird, ist der Timer aus dem „System.Windows.Forms„-Namespace. Das ist auch der Timer, der sich standardmäßig in der Steuerlemente-Toolbox befindet.

5 verschiedene Timer – VB.NET Timer Beispiel

Wenn man nun durch Recherche die ersten paar Forenbeiträge gefunden hat, werden einem mehr oder weniger auch hier und da auch anderen Klassen auffallen.

Wer tiefer forscht wird – jedenfalls mir bekannt – 5 Timer im .NET Framework von Microsoft finden.

Ja richtig gehört, es sind ganze fünf!

Die verschiedenen Timer

Der Vollständigkeit halber, liste ich hier gerne alle mir bekannten Timer auf:

Letztendlich geht es in diesem Beitrag allerdings um den folgenden Timer, lass dich also bitte vor allem als Anfänger nicht davon einschüchtern, bzw. verwirren!

System.Windows.Forms.Timer

VB.NET Timer Beispiel – Das Timer Steuerelement

Schauen wir uns nun nach dem Intro-Gerede 😉 das Timer-Control mal genauer an.

Konstruktoren

Das Timer-Steuerelement hat 2 verschiedene Konstruktoren:

new()

Einmal den leeren Konstruktor, dementsprechend ohne Parameter.

new(container)

Und als nächstes den Konstruktor mit einem Parameter namens Container. Um die ganze Sache nicht unnötig zu verkomplizieren, ist diese Überladung des Konstruktors einfach nur dazu da, den Timer mit einem Container zu assoziieren. Dies geschieht zum Beispiel im Hintergrund, wenn der Timer aus der Toolbox auf die Form gezogen wird. Dazu kann man sich auch gut den Designer-Code der Form einmal anschauen, aber Vorsicht, nichts kaputtmachen!

Me.Timer1 = New System.Windows.Forms.Timer(Me.components)

Eigenschaften / Properties

Folgende Eigenschaften hat der Timer zu bieten

Name

Naja das ist natürlich eine mehr oder weniger Standard-Eigenschaft. Mit diesem Namen spricht man den Timer nachher im Code an.

Enabled

Dieser Wert gibt an, ob der Timer gerade „läuft„, also ob er gerade sein Tick-Ereignis im angegebenen Intervall signalisieren und wiederholen soll. Hat praktisch den gleichen Effekt wie die nachfolgenden Methoden.

Interval

Mit der Interval-Property legen wir fest, bzw. rufen wir ab, in welcher Frequenz der Timer tickt, also seinen Code abarbeitet. Standardmäßig steht der Wert auf 100 Millisekunden. Einen Tipp den ich mal vor ewigen Zeiten gelesen habe ist, das Intervall des Timers nicht unter 18ms zu stellen, da das menschliche Auge wohl eh nichts darunter wahrnehmen kann – ob’s stimmt, keine Ahnung 😊.

GenerateMember

Auch eine ich würde sagen Standardeigenschaft für Steuerelemente aus dem .NET Framework. Wenn die Eigenschaft auf False steht, kann man im Code nicht auf das jeweilige Control zugreifen. Habe ich zugegebenermaßen noch nie dran rumgespielt und noch nie jemanden erlebt, der das getan hatte. Hört sich für Controls die eben nicht angesprochen werden müssen sinnvoll und ressourcenschonender an. Ich denke mir allerdings auch, dass den Fehler kaum ein anderer Programmierer so schnell finden würde. Wer denkt in dem Moment daran, wenn man plötzlich ein Control nicht ansprechen kann.

Modifiers

Damit kann man den Zugriff, bzw. die Sichtbarkeit des Controls bestimmen. Standardmäßig steht Sie auf Friend. Friend aus VB.NET entspricht dem internal-Modifizierer aus C# und bedeutet, dass man das Element aus der selben Assembly aus erreichen kann. Braucht man eigentlich nicht anfassen..

Tag

Diese Eigenschaft bietet die Möglichkeit benutzerdefinierte Daten an das Objekt zu knüpfen. So viel jedenfalls zur komplizierten Beschreibung aus Visual Studio. Einfach gesagt: Du kannst eine eigene Klasse erstellen, instanziieren und dem Tag des Controls zuweisen. So kannst du dann später wieder auf die Daten zugreifen, indem du diese natürlich wieder in den richtigen Typ castest und mit dem Getter aus der Eigenschaft herausholst.

Methoden

Hier gehe ich auf die wichtigen, jedoch nicht auf alle Methoden des Timers ein.

Start

Startet den Timer und hat praktisch den selben Effekt, wie die Enabled-Eigenschaft auf True zu setzen.

Stop

Stoppt den Timer und hat praktisch den selben Effekt, wie die Enabled-Eigenschaft auf False zu setzen.

Ereignisse

Tick

Das wichtigste Ereignis des Timers, wo eigentlich alles seinen Lauf nimmt. Dieses Ereignis wird im angegebenen Intervall aufgerufen und bietet uns so die Möglichkeit, Code wiederholend aufzurufen.

VB.NET Timer Beispiel – Vorstellung beendet

Beispielcode – Los geht’s

Nachdem ich das Timer-Steuerelement nun schon ein wenig detaillierter dargestellt habe und man nun wichtige Eigenschaften, Methoden, usw. kennt, können wir loslegen 🤓.

Fallbeispiel – Digitale Uhr

In unserem VB.NET Timer Beispiel werden wir es mal versuchen, eine kleine digitale Uhr darzustellen.

Der erste Gedanke ggf.: „Okay, ich muss also jede Sekunde, die aktuelle Uhrzeit anzeigen„.

Schauen wir uns das Ganze mal an:

Timer auf die Form ziehen

Um mit dem VB.NET Timer Beispiel zu beginnen, musst du ein Timer-Steuerelement auf die Form ziehen. Wundere dich jedoch nicht, dass das Control im Gegensatz zu einem Button z. B. nicht direkt auf der Form auftaucht.

Stattdessen positioniert sich der Timer unterhalb der Form und in einem gesonderten Bereich:

Timer werden in gesondertem Bereich untergebracht – VB.NET Timer Beispiel
Timer werden in gesondertem Bereich untergebracht – VB.NET Timer Beispiel

Wann geht es los?

Zuerst müssen wir uns Gedanken machen, wann der Timer immer zuschlagen, also den Code ausführen soll.

In unserem Beispiel könnten wir also sagen: Jede Sekunde, richtig? Nope, leider nicht!

Wieso nicht? Ich versuche es mit meinen außerordentlichen Paint Skills – löl – zu verdeutlichen:

Wir erinnern uns ans gute Versteckspielen aus der Kindheit! Derjenige der zählt, hat das ungefähr so gemacht

Die Zeit zählen – Tick praktisch in Sekunden

Er hat bei 1 begonnen (der erste Tick), dann hat er 1 Sekunde gewartet und bei 2 weiter gemacht, wieder eine Sekunde gewartet, 3, usw..

Nunja, aber nur weil unsere Freundin, bzw. unser Freund in diesem Rhythmus und vor allem zu diesem Zeitpunkt begonnen hat zu zählen, heißt das jedoch nicht, dass es synchron mit der tatsächlichen Zeit ist.

Wenn unsere Computer-Uhr zum Beispiel einen Sekunden-Sprung macht, heißt das nicht, dass auch wir diesen Sprung beim Zählen in diesem Moment machen – weil wir eventuell einfach wenige Millisekunden vorher erst begonnen haben zu zählen.

Timer Sekunden Ticks verzögert

Nachdem der Timer nun schon „auf der Form“ ist und wir einen möglichen Fallstrick verstanden haben, können wir anfangen zu coden.

Das Intervall des Timers sollte für die Uhr also auf dem Standardwert von 100ms ausreichen.

Das Tick-Ereignis mit Code versehen

Fügen wir nun den Code hinzu, der die Uhrzeit z. B. in einem Label anzeigt, daher das Label zur Form hinzuzufügen nicht vergessen!

Ich habe den Timer1 noch in etwas Passenderes, also z. B. tmrTime unbenannt und das Label passend lblTime genannt.

Private Sub tmrTime_Tick(sender As Object, e As EventArgs) Handles tmrTime.Tick
    lblTime.Text = DateTime.Now.ToString("HH:mm:ss")
End Sub

Let’s Debug

Starte das Programm nun mit F5 bzw. mit dem Play-Knopf oben in der Mitte in Visual Studio.

Und? Was passiert!? Nichts, haha 😂.

Vergiss nicht, den Timer in z. B. dem „Form-Load“-Ereignis (z. B. Doppelklick auf die Form selbst) durch tmrTime.Start() zu starten.

Alternativ kannst du den Timer natürlich auch standardmäßig laufen lassen, indem du im Designer die Timer-Eigenschaft „Enabled“ auf True setzt.

Fertig – So sieht die digitale Uhr z. B. aus

Hier ein animiertes Bild von meiner digitalen Timer Uhr:

VB.NET Timer Beispiel – Digitale Uhr

Tickst du noch ganz richtig?

Ich kann mich noch zu gut an ein bestimmtes Problem erinnern, Welches ich als Anfänger hatte.

Zeit floß in die Recherche und der Code wurde mehrfach überprüft, bis ich dann endlich fündig wurde..

Ich hatte eine Synchronisation eines Terminkalenders gebaut und stieß dort auf das Problem.

Timer Arbeitsaufgabe Beispiel

Die Aufgabe – Terminkalender Synchronisation

Tja da stand ich damals bei meiner ersten Anstellung und sollte die Aufgabe erledigen, die Termine eines Kalenders zu synchronisieren.

Den Kalender an sich hatte ich schon – relativ mühelos – gebaut, nachfolgend ging es also nur noch um die Auflistung der Termine darin.

Auch dies stellte rein vom Code her kein Problem für mich dar, bis..

Die Synchronisations-Schleife

Da natürlich wie immer alles schnell gehen musste, nahm ich *zack* einen Timer zur Hand, zog ihn auf die jeweilige Form und fing an im Tick-Ereignishandler in die Tastatur zu hacken.

Ein paar Datenbank-Abfragen hier, ein paar Gruppierungen da, zum Schluss noch ein paar Schleifen und das Ding stand.

Nur ein komischer Bug war da..

Der Timer „überlappte“

Das war nachher der Ursprung des Fehlers. Die Verarbeitung der Daten dauerte länger, als das Intervall des Timers bis zur nächsten Ausführung Zeit gab – Fail!

Lösung A:

Den Timer so lange pausieren, wie der Tick-Handler zum Abarbeiten der Daten benötigt.

Lösung B:

Den Intervall des Timers hochdrehen.

Lösung C:

Ein anderes Werkzeug wie z. B. Async/Await verwenden.

Meine (damalige) Entscheidung

Aufgrund der Schnelligkeit (da ich es auswendig wusste), habe ich zur Async/Await-Variante gewechselt.

Ich habe den Timer also durch eine Async Sub ersetzt, welche Ihre Arbeit dann durch eine Schleife im Inneren im Intervall ausführte.

Die schlechteste Variante

Die schlechteste Option wäre vermutlich Lösung B, denn sobald die Arbeitslast durch mehr Daten wächst, könnte man eventuell wieder vor dem gleichen Problem stehen.

Die optimale Entscheidung

Die damals optimalste Lösung wäre vermutlich die Option A gewesen. Dadurch hätte man lediglich wenige Zeilen ergänzen müssen: Shame on me!

    Private Sub TheTimer_Tick(sender As Object, e As EventArgs) Handles TheTimer.Tick
        ' use this, or talk to the timer directly..
        Dim timer = CType(sender, Timer)
        ' stop the timer directly
        TheTimer.Stop();
        ' Data operations..
        ' start the timer again..
        TheTimer.Start()
    End Sub

Downloads

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.