mikrocontroller.net

Forum: PC-Programmierung c# Problem mit einem Thread


Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Leutz, ich versuc grad mich ein bissle in C#,
Und zwar versuch ich da grad ein ganz simples Chat Programm zu 
realisieren.
Ich öffne bereits meinen COMPort und er läuft auch nun wollt ich einen 
eigenen Thread erzeugen der die Daten von der Schnittstelle liest und in 
einer Textbox auf meiner Oberfläche anzeigt.

Hier der Code ausschnitt
Thread readThread = new Thread(Read);

static void Read()
        {
            while (_continue)
            {
                try
                {
                    string message = _serialPort.ReadLine();
                    txtRecieve.text = message;

                }
                catch (TimeoutException) { }
            }


allerdings kommt folgende Fehlermeldung
"Fehler  1  Für das nicht statische Feld, die Methode oder die 
Eigenschaft "WindowsFormsApplication2.Form1.txtRecieve" ist ein 
Objektverweis erforderlich.  "

Was mach ich falsch bzw. was muss ich ändern?!
Danköö für eure Hilfe.....

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider ist der code ein wenig kurz um was sinnvolles zu sagen.

Bei C# darf man nicht einfach aus einen Thread dinge auf der GUI ändern. 
Die Gui muss vom Hauptthread geändert werden.

Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
public class Program
    {
        

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
        
    }
}

public class Form1 : Form
    { 
     public Form1()
     {
            InitializeComponent(); //Initialisierung der Aneziege Elemente
            
     }
     private void btnOk_Click(object sender, System.EventArgs e)
     {
            InitializeSerialPort();//Initialisierung der seriellen Schnittstelle
             OpenSerialPort(); ();//serielle Schnittstelle öffnen

            _continue = true;    //variable auf true setzen
            readThread.Start(); //thread starten
        }
}

vllt. hilft der Code nun mehr;) aber dankö für deinen zügige antwort;)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leider auch nicht weil man nicht sieh in welchen Klasse der thread 
überhaupt läuft und wo txtRecieve nicht deklariert ist.

Hängt doch mal die komplette datei an.

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Thread-Routine (void Read ()) ist static, also eine Klassen-Methode, 
keine Instanz-Methode. Dadurch hat sie keinen Bezug zum Instanz-Member 
txtRecieve.

Sorg dafür, dass es ohne static läuft.

Und danach wirst du in das nächste Problem laufen, das Peter schon 
genannt hat: ein Worker-Thread darf keine GUI-Elemente bedienen. Du must 
Invoken.

Autor: Freak (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
auf das Invoken bin ich grad gestoßen^^ aber versteh es noch nich 
ganz...also hier die dateien

Autor: Freak (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und die 2.te

Autor: Freak (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
nochmals die 2. sorry da lief was falsch...

Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhhhm kein Lösungsvorschlag mehr?!

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu neue Vorschläge, wenn die alten noch nicht umgesetzt sind? Read ist 
immer noch static, das ist falsch.

Und _continue und _serialPort sollten auch nicht static sein, dafür 
gibts keinen Grund.

Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
read ist bei mir nicht mehr static

public void Read()

wenn ich jetz den Thread erstelle kommt die selbe Fehlermeldung muss ich 
beim nich static machen noch etwas beachten?!

Autor: Chris ... (dechavue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie meine Vorposter geschrieben haben darf Read nicht static sein. Also 
bei der Read Method das static weg, genauso bei _continue und 
_Serialport.

Vermutlich hast du es Static gemacht, weil sonst folgende Zeile nicht 
funktioniert:
Thread readThread = new Thread(Read);
mach hier nur die deklaration im Klassenscope und die Initialisierung im 
CTor, dann funktionierts.

Zum Invoke:
Hier musst du dich auf den GUI-Thread Synchronisieren, das läuft 
folgendermasen:
delegate void ChangeTxtReciveTextDelegate (string newText);

private void ChangeTxtReciveText (string newText){
    if(txtRecieve.InvokeRequired) //Wenn eine Synchronisierung erforderlich ist: Selbstaufruf, allserdings auf GUI-Thread umgebogen
        txtRecieve.Invoke(new ChangeTxtReciveTextDelegate (ChangeTxtReciveText), newText);
    else //Ansonsten Zugiff erlaubt, Text Ändern
        txtRecieve.Text = newText;
}

 public void Read()
        {
            while (_continue)
            {
                try
                {
                    string message = _serialPort.ReadLine();
                    MessageBox.Show( "Selected Item Text: " +message );
                    
                    ChangeTxtReciveText(message);
                    //txtRecieve.Text = message;
                }
                catch (TimeoutException) { }
            }
        }

Eventuell wäre der Backgroundworker für dich besser geeignet, der nimmt 
dir quasi die gesammte Synchronisierung ab.

Hier hast du auch noch ein bisschen was zum Lesen über Threading mit 
GUI-Zugriff: http://www.mycsharp.de/wbb2/thread.php?threadid=33113

greets

Autor: Freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey, danke jetz funktioniert es dankööö für euere Hilfe...

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.