Entwickler-Ecke

WinForms - SerialPort: Ungültiger threadübergreifender Vorgang


peterbe - Do 07.08.14 15:57
Titel: SerialPort: Ungültiger threadübergreifender Vorgang
hallo,

dieser code wird ausgeführt und es ensteht die unten stehende Fehlermeldung.
Der string buffer wird nicht in die textbox tbserRead geschrieben.
Wieso nicht?


C#-Quelltext
1:
2:
string buffer  = serPort.ReadExisting();//Die Daten,die ich seriell empfange stehen im buffer
tbSerRead.Text = tbSerRead.Text + buffer;//


Quelltext
1:
###Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement tbSerRead erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.                    

mfg
Peter

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Titel geändert.


Th69 - Do 07.08.14 16:41

Hallo,

du verwendest den Code aus dem SerialPort.DataReceived [http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx]-Ereignis? Dann beachte die Hinweise dort:
MSDN hat folgendes geschrieben:
Das DataReceived-Ereignis wird in einem sekundären Thread ausgelöst, wenn Daten vom SerialPort-Objekt empfangen werden. Da dieses Ereignis in einem sekundären Thread und nicht im Hauptthread ausgelöst wird, kann der Versuch, Elemente wie UI-Elemente im Hauptthread zu ändern, eine Threadausnahme auslösen. Falls es erforderlich ist, Elemente im Haupt-Form oder im Haupt-Control zu ändern, senden Sie Änderungsanforderungen mithilfe von Invoke zurück, der den Vorgang dann auf dem richtigen Thread ausführt.

s. z.B. [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) [http://www.mycsharp.de/wbb2/thread.php?threadid=33113]


peterbe - Fr 08.08.14 13:13

Danke!So habe ich das Problem gelöst.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        string buffer;
        private void serPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            buffer = serPort.ReadExisting();
            
            this.Invoke(new EventHandler(type));

        }
        void type(object s, EventArgs e)
        {
            tbSerRead.Text = tbSerRead.Text + buffer;//Schreibe Werte in Textbox
        }


Moderiert von user profile iconTh69: C#-Tags hinzugefügt