c# Problem mit einem Thread

Gast #1137786
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
1
Thread readThread = new Thread(Read);
2

3
static void Read()
4
        {
5
            while (_continue)
6
            {
7
                try
8
                {
9
                    string message = _serialPort.ReadLine();
10
                    txtRecieve.text = message;
11

12
                }
13
                catch (TimeoutException) { }
14
            }

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.....
Gast #1137803
Lesenswert?
• ▲
▼
1
public class Program
2
    {
3
        
4

5
        /// <summary>
6
        /// Der Haupteinstiegspunkt für die Anwendung.
7
        /// </summary>
8
        [STAThread]
9
        public static void Main()
10
        {
11
            Application.EnableVisualStyles();
12
            Application.SetCompatibleTextRenderingDefault(false);
13
            Application.Run(new Form1());
14
        }
15
        
16
    }
17
}
18

19
public class Form1 : Form
20
    { 
21
     public Form1()
22
     {
23
            InitializeComponent(); //Initialisierung der Aneziege Elemente
24
            
25
     }
26
     private void btnOk_Click(object sender, System.EventArgs e)
27
     {
28
            InitializeSerialPort();//Initialisierung der seriellen Schnittstelle
29
             OpenSerialPort(); ();//serielle Schnittstelle öffnen
30

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

vllt. hilft der Code nun mehr;) aber dankö für deinen zügige antwort;)
Gast #1137836
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.
Gast #1137888
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.
#1137904
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:
1
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:
1
delegate void ChangeTxtReciveTextDelegate (string newText);
2

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

10
 public void Read()
11
        {
12
            while (_continue)
13
            {
14
                try
15
                {
16
                    string message = _serialPort.ReadLine();
17
                    MessageBox.Show( "Selected Item Text: " +message );
18
                    
19
                    ChangeTxtReciveText(message);
20
                    //txtRecieve.Text = message;
21
                }
22
                catch (TimeoutException) { }
23
            }
24
        }

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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.