Arbeiten mit Threads in VB.NET Verfasst am: 23.08.2008, 15:50
Thema: Arbeiten mit Threads in VB.NET
Hallo,
da die Anfrage nach einem Tutorial kam, hab ich mal eines geschrieben. Sicherlich kennt ihr das Problem:
Was sind Threads? Stellt euch vor ihr schreibt eine extrem Speicherlastige Funktion. Wärend diese Funktion dann ausgeführt wird, kann der Benutzer nichts mehr an eurem Programm machen. Sprich: Die Form lässt sich nicht mehr bewegen, Die Form reagiert nicht mehr und der Benutzer denkt, dass das Programm soeben ins Graß gebissen hat
In VB.NET gibt es dafür sog. Threads, die sich sogar ziemlich leicht verwenden lassen. Dabei wird für die Funktion die ihr aufruft ein neuer Thread erstellt. Der Benutzer kann wärend eine Funktion ausgeführt wird trotzdem weiterarbeiten.
Verwendung
Um Threads verwenden zu können benötigt ihr ersteinmal den Namespace System.Threading
Öffnet daher das Codefenster und schreibt nach ganz oben Visual Basic: [code]Imports System.Threading[/code]
Nun stehen euch die Threads zur Verfügung.
Erstellt euch jetzt eine Sub mit dem Namen "TestSub", euer Code sollte nun so aussehen:
Visual Basic: [code] Imports System.Threading Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Public Sub TestSub()
End Sub End Class [/code]
In diese Sub könnt ihr nun extrem Speicherlastige Funktionen hineinschreiben - in diesem Tutorial wollen wir alle Zahlen von 1-10000000 auflisten, die durch 3 teilbar sind. Normalerweise müsste der Benutzer ziemlich lange warten, bis er wieder was machen könnte.
Schreibt in eure testSub folgenden Code:
Visual Basic: [code] Dim Liste As String = "" For i = 1 To 10000000 If i Mod 3 = 0 Then Liste = Liste & i & ";" End If Next [/code]
Auf eure Form platziert ihr nun 2 Buttons (Button1 und Button2)
Doppelklickt auf den ersten Button, so dass sich das CodeFenster öffnet, beim Klick soll die Sub gestartet werden.
Visual Basic: [code] Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call TestSub() End Sub [/code]
Ein Klick auf diesen Button würde euer Visual Studio zum Absturz bringen! Projekt vorher speichern!
Bis jetzt wird die Sub nicht in einem seperatem thread gestartet, dafür müsst ihr noch eine Variable deklarieren, in diesem Tutorial nennen wir sie "BeispielThread"
Visual Basic: [code]Dim BeispielThread As New Thread(AddressOf TestSub)[/code]
Dieser Code sagt nichts anderes aus, als dass ein neuer Thread mit dem Namen BeispielThread erstellt werden soll. Beim starten des Threads soll dann die Funktion/Sub "TestSub" abgerufen werden.
Euer gesamter Code sollte nun in etwa so aussehen:
Visual Basic: [code]Imports System.Threading Public Class Form1
Dim BeispielThread As New Thread(AddressOf TestSub) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Public Sub TestSub() Dim Liste As String = "" For i = 1 To 100000 If i Mod 3 = 0 Then Liste = Liste & i & ";" End If Next End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call TestSub() End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
End Sub End Class[/code]
Zurück zum Button;), damit euer Programm nun auch wirklich weiterlaufen kann müsst ihr das "Call TestSub()" durch
Der zweite Button, den ihr auf eurer Form platzieren solltet ist eigentlich unnötig. Aber ich will euch ja zeigen, dass es wirklich funktioniert
Fügt daher folgenden Code in das Event "Button2_Click" hinzu:
Visual Basic: [code]MsgBox("Ich bin nur ein test" & vbCrLf & "Man könnte mich ohne Threads garnicht anklicken") [/code]
Das wars auch schon im groben, startet nun euer Programm und klickt zunächst auf den ersten Button. Der zweite Thread arbeitet nun im Hintergrund wärend ihr ohne Probleme den zweiten Button anklicken könnt.
Fehlerbehandlung
1. Beim zweiten Klick auf den ersten Button schmiert mein Projekt ab
Das passiert, weil der Thread bereits gestartet ist. Ihr könnt abfragen, ob der Thread bereits gestartet wurde. Ersetzt den Code des ersten Button mit diesem:
Visual Basic: [code] If x.ThreadState = ThreadState.Unstarted Then x.Start() Else MsgBox("Thread bereits gestartet") End If [/code]
2. Ich kann mit dem Thread keine ListBox Einträge hinzufügen o.Ä.
Das passiert, weil die Objekte in einem anderen Thread gestartet sind. Lösung: Speichert das, was ihr speichern wollt zuerst in einer Globalen Variable.