VB 2005 Express: Cross-thread operation not valid

Hallo Leute!

Ich habe folgendes Problem: Ich habe einen Funkscanner, mit dem ich mich über die serielle Schnittstelle unterhalte(unterhalten möchte). Um die Sache universell zu gestalten habe ich mir eine eigene Klasse dafür geschrieben, welche ein Ereignis auslöst, wenn der Scanner Daten liefert. Hier einige Codefragmente der Klasse:

class Scanner
Public Event receiveData(ByVal sData As String)
Dim WithEvents comTemp As New System.IO.Ports.Serialport

Private Sub getData(…) Handles comTemp.DataReceived
RaiseEvent receiveData(comTemp.ReadLine)
End Sub
End Class

Jetzt einige Fragmente meiner eigentlichen Anwendung:

dim myScanner as New Scanner

Private Sub receiveData(ByVal sData As String) Handles myScanner.receiveData
MessageBox.Show(sData) ’ funktioniert
Me.TextBox.Text=sData ’ funktioniert NICHT
End Sub

Hier taucht das Problem auf: Wenn ich die Daten per Messagebox ausgebe, dann funktioniert es einwandfrei, allerdings nicht, wenn ich den Inhalt eines Steuerelementes (in diesem Fall die Textbox) mit dem eingelesenen Inhalt füllen möchte. Ich erhalte folgende Fehlermeldung:

Cross-thread operation not valid: Control ‚TextBox1‘ accessed from a thread other than the thread it was created on

An den BackgroundWorker hab ich schon gedacht, ist aber nicht das Richtige für mit, da ich ja nicht weiß, wann das Einlesen des Scanners passiert…

Vielleicht kennt ja jemand dieses Problem und kann mir hier weiterhelfen… Wäre mit wirklich sehr geholfen!

Gruß aus OÖ, Alfred

Hallo!

Kurz gesagt versuchst Du den Inhalt der TextBox aus einem anderen Thread heraus zu setzen, als dem, in dem die TextBox erzeugt wurde. Das ist ein generelles Problem von Multithreading-Anwendungen, das UI darf nur vom eigenen Thread aktualisiert werden.

Als Lösung muss das Setzen des Textes per delegate erfolgen, der mittels Control.Invoke() oder Control.BeginInvoke() aufgerufen wird.

Schau’ Dir vielleicht mal diesen Artikel an, der könnte Dir weiterhelfen: http://msdn.microsoft.com/library/default.asp?url=/l…

Gruß,
Martin

Hallo und besten Dank :o)

Der Hinweis mit Invoke war sehr hilfreich… jetzt funzt die Sache!

Danke nochmals, Gruß, Alfred