Forum: PC-Programmierung verständnis problem Control.Invoke C#


von Pier S. (bigpier)


Lesenswert?

Hallo,
Ich bin schon wieder bei einem Problem angelangt wo ich die Hilfe 
einfach nicht verstehe!!
1
 
2
3
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
4
        {
5
            ComOut3 Message = new ComOut3();
6
            byte[] array = new byte[6];
7
            if (serialPort1.Read(array, 0, 6) == 6)
8
            {
9
                Message.start = array[0];
10
                Message.adres = array[1];
11
                Message.eine_nummer = (int)array[2];    
12
                Message.eine_nummer += (int)array[3] << 8;
13
                Message.chksum = array[4];
14
                Message.ende = array[5];
15
            }
16
            char[] buff = new char[1];
17
            buff[0] = (char)Message.start;
18
            serialPort1.Write(buff, 0, 1);
19
            buff[0] = (char)Message.ende;
20
            serialPort1.Write(buff, 0, 1);
21
            //TB_rx1.Invoke = (newMethodInvoker(serialPort1_DataReceived));
22
            TB_rx1.Text = string.Format("{0:x2}", Message.start);
23
            TB_rx2.Text = string.Format("{0:x2}", Message.adres);
24
            TB_rx3.Text = string.Format("{0:d6}", Message.eine_nummer);
25
            TB_rx4.Text = string.Format("{0:x2}", Message.chksum);
26
            TB_rx5.Text = string.Format("{0:x2}", Message.ende);
27
        }
ich bekomme immer folgende Fehlermeldung:

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

und das mit dem Control.Invoke  krieg ich nicht hin!
Vielen Dank für Eure Hilfe

Pier

von Mars (Gast)


Lesenswert?

Windows Forms Controls dürfen nur aus dem Thread verändert werden, 
welcher das Control erzeugt hat. In deinem Fall dem Main/GUI - Thread. 
Sagt ja auch schon die Fehlermeldung...
1
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) {
2
  ...
3
  SetText("Foo Bar");
4
}
5
6
private delegate void MethInvDel(string text);
7
8
private void SetText(string text) {
9
  if (TB_rx1.InvokeRequired) {
10
    TB_rx1.Invoke(new MethInvDel(SetText), text);
11
  } else {
12
    TB_rx1.Text = text;
13
  }
14
}

von Pier S. (bigpier)


Lesenswert?

Danke ! Gibt es dazu auch eine kürzere Form???

Gruß
Pier

von Johnny (Gast)


Lesenswert?

Ich glaube nicht, das passt schon.

von Pier S. (bigpier)


Lesenswert?

Ok Danke und schönen Feierabend

Gruß Pier

von Mars (Gast)


Lesenswert?

Du könntest das ganze auch in eine anonyme Methode direkt in den 
DataReceived-Event packen. Du kannst dir auch im Prinzip den 
InvokeRequired-Block sparen. Das macht die Sache zwar kürzer, aber nicht 
unbedingt leserlicher.

von peterle (Gast)


Lesenswert?

Microsoft Visual Studio 2010
Version 10.0.30319.1 RTMRel
Microsoft .NET Framework
Version 4.0.30319 RTMRel

Das ist die Version meines Visual Studios!

von Peter II (Gast)


Lesenswert?

>  if (serialPort1.Read(array, 0, 6) == 6)

wird aber NIE sauber funktionieren. Es kann passieren das erst 1 zeichen 
und beim nächsten Event noch mal 5 zeichen kommen. Oder sogar das alle 
Zeichen einzeln kommen.

von A. S. Deheff (Gast)


Lesenswert?

peterle schrieb:
> Das ist die Version meines Visual Studios!
Kennst du Wayne? Der ist schon mehr als vier Jahre tot.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.