Thread soll Ergebnis in einem Label anzeigen

03/12/2007 - 08:08 von Hartmut Callies | Report spam
Hallo,
ich sitze bereits einige Zeit an folgendem Problem:
Das Programm besteht aus einer Form1 mit Label1
und einer Klasse clsTest. Die Methode Start von der
Klasse soll in einem eigenen Thread abgearbeitet werden
und anschließend das Ergebnis im Label1 anzeigen.
Ich will keinen Backroundworker einsetzen und der
Thread soll in der Klasse definiert werden!
Das Abarbeiten der Methode in einem eigenen Thread
funktioniert bestens. Nur die Übergabe des Ergebnisses
an das Label1 schaffe ich nicht. Da die Lösung etwas
universell sein soll, übergebe ich das Objekt Label1 an
die Klasse mittels einer Eigenschaft.
Vielleicht hat jemand eine Lösung.

Hartmut Callies

Hier die vereinfachte Variante:


Imports System.Threading

Public Class clsTest
Friend objThread As Thread
Friend Delegate Sub dstart()
Friend objLabel as Label

Friend WriteOnly Property SetLabel() As Label
Set(ByVal value As Label)
objLabel = value
End Set
End Property

Friend Sub Initialize()
objThread = New Thread(AddressOf start)
objThread.Priority = ThreadPriority.Lowest
objThread.IsBackground = TrueobjThread.Start()
End Sub

Friend Sub Start ()
Dim strText as String

strText = "TestText"
If objLabel.InvokeRequired Then
Dim d As New dstart(AddressOf start)
objLabel.Invoke(d)
Else
objLabel.Text = strText
End if
End Sub
End Class

________________________________________________

Public Class Form1
Private clsT as New clsTest

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
clsT.SetLabel = me.Label1
clst.Initialize()
End Sub
End Class
 

Lesen sie die antworten

#1 Peter Götz
03/12/2007 - 10:51 | Warnen spam
Hallo Hartmut,

ich sitze bereits einige Zeit an folgendem Problem:
Das Programm besteht aus einer Form1 mit Label1
und einer Klasse clsTest. Die Methode Start von der
Klasse soll in einem eigenen Thread abgearbeitet werden
und anschließend das Ergebnis im Label1 anzeigen.
Ich will keinen Backroundworker einsetzen und der
Thread soll in der Klasse definiert werden!



Bis hierher erst mal kein Problem.

Das Abarbeiten der Methode in einem eigenen Thread
funktioniert bestens. Nur die Übergabe des Ergebnisses
an das Label1 schaffe ich nicht.



Wenn es nur um das eine LabelControl geht, funktioniert
Dein unten gezeigter Code eigentlich schon. Wenn es
im echten Code aber um mehrere Controls geht wàre
statt

objLabel.Invoke(d)

ein

Form.Invoke(d)

angebracht.

Da die Lösung etwas universell sein soll,
übergebe ich das Objekt Label1 an
die Klasse mittels einer Eigenschaft.

Vielleicht hat jemand eine Lösung.

Hartmut Callies

Hier die vereinfachte Variante:


Imports System.Threading

Public Class clsTest
Friend objThread As Thread
Friend Delegate Sub dstart()
Friend objLabel as Label

Friend WriteOnly Property SetLabel() As Label
Set(ByVal value As Label)
objLabel = value
End Set
End Property

Friend Sub Initialize()
objThread = New Thread(AddressOf start)
objThread.Priority = ThreadPriority.Lowest
objThread.IsBackground = TrueobjThread.Start()
End Sub

Friend Sub Start ()
Dim strText as String



Dim F as Form = DirectCast(objLabel.Parent, Form)

strText = "TestText"
If objLabel.InvokeRequired Then



if F.InvokeRequired then

Dim d As New dstart(AddressOf start)
objLabel.Invoke(d)



F.Invoke(d)

Else
objLabel.Text = strText
End if
End Sub
End Class

________________________________________________

Public Class Form1
Private clsT as New clsTest

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
clsT.SetLabel = me.Label1
clst.Initialize()
End Sub
End Class




Wie schon oben erwàhnt würde Dein Code
soweit schon funktionieren. Wo also genau ist
das konkrete Problem?

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen