Forum: PC-Programmierung c# Problem mit einem Thread


von Freak (Gast)


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.....

von Peter (Gast)


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.

von Freak (Gast)


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;)

von Peter (Gast)


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.

von tuppes (Gast)


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.

von Freak (Gast)


Angehängte Dateien:

Lesenswert?

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

von Freak (Gast)


Angehängte Dateien:

Lesenswert?

und die 2.te

von Freak (Gast)


Angehängte Dateien:

Lesenswert?

nochmals die 2. sorry da lief was falsch...

von Freak (Gast)


Lesenswert?

mhhhm kein Lösungsvorschlag mehr?!

von tuppes (Gast)


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.

von Freak (Gast)


Lesenswert?

read ist bei mir nicht mehr static
1
public void Read()

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

von Chris .. (dechavue)


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

von Freak (Gast)


Lesenswert?

hey, danke jetz funktioniert es dankööö für euere Hilfe...

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.