Freies Threading mit Visual Basic .NET
Veröffentlicht: 04. Sep 2003 | Aktualisiert: 27. Jun 2004
Von Mathias Schiffer
VB-Anwender waren bisher nicht verwöhnt, was das quasiparallele Ausführen von Threads angeht. Mit Visual Basic .NET wird nicht nur alles besser, sondern auch einfacher.
Unter Visual Basic 6.0 bedurfte es einiger, mitunter schmerzhafter Umwege, um die Ausführung mehrere Threads erreichen zu können.
Mit Visual Basic .NET lassen Sie diese Schmerzen hinter sich: Der AddressOf-Operator und vor allem der Namespace System.Threading machen die Ausführung mehrerer Threads zum reinsten Kinderspiel!
Erzeugen Sie einfach ein neues Thread-Objekt, dem Sie als Konstruktor mithilfe von AddressOf die Adresse einer Threadmethode übergeben. Diese Threadmethode ist absolut nichts besonderes oder kompliziertes - sie ist schlicht diejenige (parameterlose) Methode, die bei Start des Threads ausgeführt werden soll. Den Thread starten Sie dann mit der Start-Methode des erzeugten Thread-Objekts.
Ein einfaches Konsolen-Beispielprogramm zeigt, wie neben dem "Hauptprogramm" zusätzlich zwei Threads quasiparallel ablaufen. Alle drei Anwendungsteile geben abwechselnd ihre Ausgaben in ein Konsolenfenster aus:
Imports System.Threading ' ... Class FreeThreading Shared Sub Main() Try ' Einen Thread fuer Shared Sub Thread1 anlegen Dim T1 As New Thread(AddressOf Thread1) ' Die Thread-Priorität festlegen T1.Priority = ThreadPriority.Normal ' Den Thread starten T1.Start() ' Einen Thread fuer Shared Sub Thread2 anlegen Dim T2 As New Thread(AddressOf Thread2) ' Die Thread-Priorität festlegen T2.Priority = ThreadPriority.Normal ' Den Thread starten T2.Start() ' Neben den beiden gestarteten Threads zur Demonstration ' auch an dieser Stelle weiter nebenläufigen Code aus- ' führen: Do Console.WriteLine("Hier ist das 'Hauptprogramm'.") Thread.Sleep(500) Loop ' Fehler abfangen und ausgeben Catch e As Exception MsgBox(e.ToString) End Try End Sub Shared Sub Thread1() ' Zur Demonstration der Quasiparallelität wird eine ' blockierende Schleife verwendet. Ausserhalb eines ' eigenen Threads würde neben diesem Code kein wei- ' terer Code ausgeführt werden. Do Console.WriteLine("Hier ist Thread1. (Abbruch über Strg+C)") Thread.Sleep(500) Loop End Sub Shared Sub Thread2() ' Zur Demonstration der Quasiparallelität wird eine ' blockierende Schleife verwendet. Ausserhalb eines ' eigenen Threads würde neben diesem Code kein wei- ' terer Code ausgeführt werden. Do Console.WriteLine("Hier ist Thread2. (Abbruch über Strg+C)") Thread.Sleep(500) Loop End Sub End Class
Datenübergabe an Threads
Möchten Sie vor dem Start eines Threads Daten an diesen übergeben, so können Sie solche Daten leider nicht einfach als Parameter der zugehörigen Startmethode des Threads weitergeben.
Sie können jedoch die Startmethode für einen Thread in einer Klasse definieren. So können Sie zunächst ein Objekt erzeugen, mit dem Sie beliebig kommunizieren können (und das beliebige Daten speichern kann), bevor Sie die Startmethode des Threads als Methode dieses Objekts aufrufen. Somit hat der erzeugte Thread selbstverständlich Zugriff auf die Daten dieses Objekts.
Auch für dieses Vorgehen soll ein einfaches Beispiel nicht fehlen. Der Code erzeugt zunächst ein Objekt der im Projekt definierten Klasse ThreadingData und übergibt an dieses Objekt das aktuelle Datum inkl. Uhrzeit (Now). Danach wird die StartThread-Methode des Objekts als Thread-Startmethode verwendet. Wie schon im obigen Beispiel gibt der so erzeugte Thread zyklisch einen String in das Konsolenfenster aus - diesmal aber ist darin die zuvor von außen an den Thread übergebene Uhrzeit enthalten.
Imports System.Threading ' ... Class FreeThreading Shared Sub Main() Try ' Ein Objekt für den Thread anlegen Dim TObj As New ThreadingData ' Ein Datum an das Objekt übergeben TObj.DateTime = Now ' Ein Thread-Objekt erzeugen Dim T1 As New Thread(AddressOf TObj.StartThread) ' Die Thread-Priorität festlegen T1.Priority = ThreadPriority.Normal ' Den Thread starten T1.Start() Do Console.WriteLine("Hier ist das 'Hauptprogramm'.") Thread.Sleep(500) Loop ' Fehler abfangen und ausgeben Catch e As Exception MsgBox(e.ToString) End Try End Sub End Class Public Class ThreadingData ' Nimmt Daten für einen Thread auf und stellt die ' Thread-Methode "StartThread" zur Verfügung ' Öffentliche Eigenschaft (bewusst einfaches Beispiel) Public DateTime As Date Public Sub StartThread() ' Threadverarbeitung mit Informationsübernahme ' durch Eigenschaften dieser Klasse: Do Console.WriteLine("Der Thread wurde gestartet um " _ & DateTime.ToShortTimeString) Thread.Sleep(500) Loop End Sub End Class
Dieser MSDN Quickie konnte naturgemäß nur an der Oberfläche der vielfältigen Möglichkeiten des freien Threadings mithilfe des .NET Frameworks kratzen. Machen Sie sich auf Basis dieser simplen Beispiele mit der Technik des freien Threadings unter Visual Basic .NET vertraut - es lohnt sich!