Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Tutorials
Autor
Nachricht
r4z3r
Poster
Poster

Anmeldedatum: 16.04.2008
Beiträge: 173

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 Very Happy

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

Visual Basic: [code]BeispielThread.Start[/code]
ersetzen.

Der zweite Button, den ihr auf eurer Form platzieren solltet ist eigentlich unnötig. Aber ich will euch ja zeigen, dass es wirklich funktioniert Very Happy

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.


[CENTER]Bis zum nächsten mal.

[/CENTER]
_________________
 
^^kev####
Überflieger
Überflieger

Anmeldedatum: 01.05.2008
Beiträge: 476
Wohnort: Haan


Verfasst am: 23.08.2008, 16:04

Wäre gut, wenn du noch was zum Invoke sagst Wink
_________________
 
staebche
Newbie
Newbie

Anmeldedatum: 11.04.2009
Beiträge: 14


Verfasst am: 06.07.2009, 10:45

allerdings, denn threads an sich sind einfach, aber die delegates
für threadübergreifende steuerelemente versteh ich nicht.

zB für eine statusbar während das prog läuft?
_________________


 
Metropoler
Newbie
Newbie



Anmeldedatum: 20.02.2009
Beiträge: 4
Wohnort: Düsseldorf


Verfasst am: 14.08.2009, 17:04


Aber zunächst erstmal einen großen Dank Very Happy Ich brauch dauernd irgendwelche Threads.

Was noch fehlt ist eben die Threadsichere zugreifen auf Window-Forms Steuerelemente.
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Tutorials

Tags: thread, threading, threads, tutorial, visual

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Wie kann ich mich bei euch anmelden?? 387 20.05.2002, 01:28
Keine neuen Beiträge Eine kleine Frage an euch.. 373 30.09.2007, 09:57
Keine neuen Beiträge TopMost Funktion unter DirectX 432 27.07.2007, 11:48
Keine neuen Beiträge Wie Funktion nutzen ? 540 29.06.2007, 21:59
Keine neuen Beiträge update funktion einbauen 741 29.01.2007, 00:11
 



[ Time: 0.3777s ][ Queries: 93 (0.1376s) ][ GZIP on - Debug on ]