Autor Beitrag
ottto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 15.05.14 08:41 
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."<-

ausblenden 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 user profile iconTh69: Topic aus IO, XML und Registry verschoben am Do 15.05.2014 um 09:20
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => TB2.Text = indata));					

(s.a. Erstellen reaktionsfähigerer Anwendungen mit dem Dispatcher)

Für diesen Beitrag haben gedankt: ottto
ottto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 15.05.14 15:43 
Funktioniert!!! Vielen Dank für die Hilfe!!!
Gruß.
ottto