ottto - Do 15.05.14 08:41
Titel: WPF-TextBox füllen
Hallo zusammen,
ich mache gerade die ersten Schritte in der objektorientierten Programmierung und hätte zu einem Beispielprogramm eine Verständnisfrage.
Die Daten von meinem Handscanner sollen über die serielle Schnittstelle ausgelesen und in einer WPF-TextBox ausgegeben werden.
Das Auslesen der seriellen Schnittstelle funktioniert. Die Scannerdaten werden in einer MessageBox angezeigt. Beim Versuch diese in die TextBox(TB2) zu schreiben kommt der Fehler:
->"Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet."<-
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); SerialPort mySerialPort = new SerialPort("COM1");
mySerialPort.BaudRate = 9600; mySerialPort.Parity = Parity.None; mySerialPort.StopBits = StopBits.One; mySerialPort.DataBits = 8; mySerialPort.Handshake = Handshake.None;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler);
mySerialPort.Open(); } private void DataReceviedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); MessageBox.Show(indata); TB2.Text = indata; } } |
Kann mir jemand einen Lösungsansatz geben?
Danke.
Gruß.
ottto
Moderiert von
Th69: Topic aus IO, XML und Registry verschoben am Do 15.05.2014 um 09:20
Th69 - Do 15.05.14 09:19
Hallo und :welcome:
auf GUI-Elemente (z.B. TextBoxen) darf nur aus dem GUI-Thread zugegriffen werden. Die
DataReceived-Ereignismethode wird jedoch aus einem eigenen Thread heraus aufgerufen (damit die GUI weiterhin bedienbar bleibt, wenn der
SerialPort auf Daten wartet).
Mittels des
Dispatcher-Objekts läßt sich jedoch der Aufruf an den GUI-Thread delegieren:
C#-Quelltext
1:
| Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => TB2.Text = indata)); |
(s.a.
Erstellen reaktionsfähigerer Anwendungen mit dem Dispatcher [
http://msdn.microsoft.com/de-de/magazine/cc163328.aspx])