Entwickler-Ecke
WinForms - GUI-Werte verändern in einem Thread
Schandtäter - So 14.12.08 16:09
Titel: GUI-Werte verändern in einem Thread
Hallo,
ich habe ein Fenster, mit TextBoxes und Labels als auch mit Buttons und einer ProgressBar.
Ich möchte einen Schleifendurchlauf starten, bei dem der Benutzer durch einen Buttonklick des Ende der Schleife bestimmt. Bis zu diesem Event soll die Schleife immer den gleichen Job durchführen.
Damit die Schleife aber beendet werden kann, muss diese Schleife in einen separaten Thread.
Wie kann ich den Thread von "außen" starten, stoppen, pausieren und fortsetzen?
Ich hab jetzt schon einige Tutorials gelesen und einige Snippets versucht zu verstehen, aber irgendwie sind die Lösungen immer auf Spezialfälle zugeschnitten. Ich will einfach was stinknormales. Gut, so wie es geschrieben ist, ist es wahrscheinlich zuviel verlangt.
Euer Schandtäter
jaenicke - So 14.12.08 16:29
Du rufst von außen Terminate auf, und im Thread prüfst du mit Terminated ob die Beendigung von außen angefordert wurde.
Außerdem gibt es noch Suspend, Suspended und Resume.
Mehr zum Thema Threads:
http://www.delphi-treff.de/tutorials/objectpascal/threads/
http://www.michael-puff.de/Developer/Delphi/Tutorials
// EDIT:
Ach ja: Und wenn du auf deine VCL-Komponenten aus dem Thread heraus zugreifen willst, dann musst du das synchronisieren. Wenn du ein neues Threadobjekt über Datei --> Neu erstellst, steht da näheres.
// EDIT2:
Da hab ich doch wieder übersehen, dass es sich um einen Beitrag im C# Forum handelt. :oops: :oops: :oops:
JüTho - So 14.12.08 17:31
Hallo und :welcome:
eine einfache Version geht meistens mit einem BackgroundWorker. Da sollte schon das Beispiel in der SDK-Doku/MSDN genügen.
Jürgen
Schandtäter - So 14.12.08 21:47
Hallo,
ich hab versucht mich da reinzufuchsen. Habe einen Thread zum Laufen bekommen. Allerdings scheitert es bei mir derzeit daran, dass ich den Thread nicht von einem Event aus Starten bzw. Stoppen kann.
Folgenden Code habe ich bisher:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| using System; using System.Threading; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;
namespace Test { public partial class MainForm : Form { public static int i=0; public MainForm() { InitializeComponent();
Thread DLoop = new Thread(new ThreadStart(download));
System.Console.ReadLine(); } public static void download() { String mystring = "Thread gestartet "; i++; mystring += i; System.Console.WriteLine(mystring); } void StartbuttonClick(object sender, EventArgs e) { DLoop.Start(); } } } |
Der Code ist von einer anderen Seitie kopiert und etwas angepasst.
So wie ich das sehe, habe ich ein Logikproblem. Irgendwie muss ich doch aus dem Event heraus den Thread steuern können.
EDIT: Ich habs jetzt nochmal probiert, den Konstruktor vor InitializeComponent zu packen, aber klappte auch nicht(gut.. hätte auch keinen Sinn ehrlich gesagt ergeben)... ich hab irgendeine Kinderkrankheit oder sowas... aber ich kriegs einfach nicht hin -.-
Gruß
Schandtäter
JüTho - Mo 15.12.08 11:16
Hallo,
Dein Fehler liegt zunächst einmal an der fehlenden Unterscheidung zwischen Deklaration und Implementation: Die Variable DLoop vom Typ Thread ist im Konstruktor deklariert, also nur dort bekannt. In StartbuttonClick ist DLoop völlig undefiniert. Lösung: Deklaration gehört in die Klasse, Initialisierung in den Konstruktor; dann passt Start in den Click-EventHandler.
Für das Stoppen brauchst Du einen zweiten EventHandler. Anstelle von Stop (was zu erwarten wäre) musst Du offensichtlich Abort verwenden.
Aber ich sagte schon: Zum Einstieg ist der BackgroundWorker viel praktischer.
Jürgen
Schandtäter - Mo 15.12.08 22:33
Mag sein das es einfacher ist. Habs grad versucht. Aber irgendwie erschlägt mich die Klasse. Habe mehrere Seiten die es aber so hochtechnisch erklären, dass ich es nicht kapiere.
Scheinbar reicht es nicht die Klasse an die "Thread"-Funktion zu übergeben.
JüTho - Di 16.12.08 11:12
Schandtäter hat folgendes geschrieben : |
Mag sein das es einfacher ist. Habs grad versucht. Aber irgendwie erschlägt mich die Klasse. Habe mehrere Seiten die es aber so hochtechnisch erklären, dass ich es nicht kapiere. |
Ich bin seinerzeit in die
SDK-Doku/MSDN gegangen (die ist meiner Ansicht nach sowieso die wichtigste Hilfe), das
Beispiel auf der Einstiegsseite zur
BackgroundWorker-Klasse genügte vollkommen.
Schandtäter hat folgendes geschrieben : |
Scheinbar reicht es nicht die Klasse an die "Thread"-Funktion zu übergeben. |
Häh? Entweder Thread oder BackgroundWorker, aber kein Gemisch! Wo oder wieso soll eine Klasse an eine Methode übergeben werden? Normalerweise wird umgekehrt ein konkretes Objekt (eine Instanz einer Klasse) an eine Methode übergeben.
Eine Thread-Funktion kenne ich nicht. Thread ist eine Klasse, und unter C# gibt es keine Funktionen, nur Methoden.
Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!