Aus einem Thread eine TextBox auf der GUI zugreifen
-
So ich nochmal,
ich kann jetzt problemlos Daten zwischen zwei Klassen tauschen. Wenn ich jedoch versuche aus einem Thread heraus, den Inhalt einer TextBox auf der GUI zu verändern, meldet mir der Debugger
Illegal cross-thread operation: Control 'textBox1' accessed from a thread other than the thread it was created on
Wie kann ich das umgehen, bzw. so gestalten, dass er mir das frisst.
Gruß
Markus Seidl
-
du musst das Objekt oder das Formular mit lock synchronisieren wenn du darauf zugreifst.
hier mal ein Beispiel:private void ThreadProc() { while(true) { lock(textBox1) { try { int temp=System.Convert.ToInt32(textBox1.Text.Trim()); textBox1.Text=(++temp).ToString(); } catch(Exception e) { Console.WriteLine(textBox1.Text+":"+ e.Message); } } Thread.Sleep(100); } } private void ThreadProc2() { while(true) { lock(textBox1) { try { int temp=System.Convert.ToInt32(textBox1.Text.Trim()); textBox1.Text=" "+(++temp).ToString(); } catch(Exception e) { Console.WriteLine(textBox1.Text+":"+ e.Message); } } Thread.Sleep(100); } } private void button1_Click(object sender, System.EventArgs e) { textBox1.Text="1"; Thread t=new Thread(new ThreadStart(ThreadProc)); t.Start(); } private void button2_Click(object sender, System.EventArgs e) { textBox1.Text="1"; Thread t=new Thread(new ThreadStart(ThreadProc2)); t.Start(); }
wenn du die Zeilen :
lock(textBox1)
auskommentierst, wirst du Fehlermeldungen bekommen. Aber nicht die, welche du angibst.
Da es ja funktioniert kann ich deine Fehlermeldung nicht nachvollziehen. Gibt es ein paar weitere Besonderheiten ?
-
Es gibt keine Besonderheiten. Ich habs jetzt nochmal probiert, und mir ist jetzt aufgefallen, dass ich den Fehler NUR im Debug Modus bekomme. Wenn ich es kompiliere, und die EXE selbst ausühre funktionierts einwandfrei.
Wie kann man das erklären?
Aber das hat mir jetzt schonmal ein gutes Stück weitergeholfen. Und du hast den Quelltext GENAUSO geformt wie ich es hatte. Einfach und verständlich. THX nochmal.
Gruß
Markus Seidl
-
Angren Aldaron schrieb:
[...]Wenn ich jedoch versuche aus einem Thread heraus, den Inhalt einer TextBox auf der GUI zu verändern, [...]
Siehe auch: Controls in einem Thread benutzen
-
Wie kann man das erklären?
Naja, klingt schon merkwürdig. Aber ohne relevanten Quellcode kann ich nicht wirklich weiterhelfen.