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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren