www.mikrocontroller.net

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


Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich bin schon wieder bei einem Problem angelangt wo ich die Hilfe 
einfach nicht verstehe!!
 

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            ComOut3 Message = new ComOut3();
            byte[] array = new byte[6];
            if (serialPort1.Read(array, 0, 6) == 6)
            {
                Message.start = array[0];
                Message.adres = array[1];
                Message.eine_nummer = (int)array[2];    
                Message.eine_nummer += (int)array[3] << 8;
                Message.chksum = array[4];
                Message.ende = array[5];
            }
            char[] buff = new char[1];
            buff[0] = (char)Message.start;
            serialPort1.Write(buff, 0, 1);
            buff[0] = (char)Message.ende;
            serialPort1.Write(buff, 0, 1);
            //TB_rx1.Invoke = (newMethodInvoker(serialPort1_DataReceived));
            TB_rx1.Text = string.Format("{0:x2}", Message.start);
            TB_rx2.Text = string.Format("{0:x2}", Message.adres);
            TB_rx3.Text = string.Format("{0:d6}", Message.eine_nummer);
            TB_rx4.Text = string.Format("{0:x2}", Message.chksum);
            TB_rx5.Text = string.Format("{0:x2}", Message.ende);
        }

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

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) {
  ...
  SetText("Foo Bar");
}

private delegate void MethInvDel(string text);

private void SetText(string text) {
  if (TB_rx1.InvokeRequired) {
    TB_rx1.Invoke(new MethInvDel(SetText), text);
  } else {
    TB_rx1.Text = text;
  }
}

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke ! Gibt es dazu auch eine kürzere Form???

Gruß
Pier

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube nicht, das passt schon.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Danke und schönen Feierabend

Gruß Pier

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peterle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. S. Deheff (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.