Thread Hilfe, wie beenden?

Fridulin

Erfahrenes Mitglied
Hallo,

Ich muß euch noch einmal mit meinen Fragen "beläßtigen". Ich habe in meinen Programm einen Thread eingebaut, es funktioniert auch alles super bis auf das Beenden des Threades.
Code:
ThreadStart Test = new ThreadStart(ThreadTest);
Thread thread = new Thread(Test);
tb1.Text = "Warte auf Verbindung... ";
if (stopp == "ja")
{
tb1.Text="gestoppt";
thread.Abort(); 
thread.Interrupt();
}


void ThreadTest()
{
try 
{
while(test==true)
{
.....
}}
Gibt es irgendeine möglichkeit die sich im Thread befindende While Schleife zu beenden und die bool variable auf false zu setzen? Ich habe es einfach nicht geschafft. Wie man oben weiter sieht habe ich auch shcon mit thread,Abort und Interuppt Probiert, allerdings hilft es alles nichts, der Thread bleibt immer da. Das Problem ist wenn ich mein Programm schließe ist die Form zwar weg, aber die Threading While schleife funktioniert weiter.
Kann man nicht an void ThreadJob eine variable mit übergeben wie andere Funktionen?

Grüße für eure Hilfe und Ratschläge währe ich sehr Dankbar.
 
Hallo Fridulin!

Wir haben uns ja lang nicht mehr gelesen.

Ich kann mich erinnern das ich Dir mal ein paar [thread=199136]Vorschläge[/thread] zum Thema Threading gemacht hab. Das WorkerThread StarterKit zeigt Dir wie es gekonnt geht.
Fridulin hat gesagt.:
Gibt es irgendeine möglichkeit die sich im Thread befindende While Schleife zu beenden und die bool variable auf false zu setzen?
Bau eine Klasse (namens WorkerThread zB) und füge eine Methode (Run zB) hinzu. Implementier eine Methode StartThread die den Thread startet.
Dann brauchts noch eine MemberVariable mit welcher Du letztendlich deinen Thread stoppen kannst.
Also ungefähr so:
Code:
using System;
using System.Threading;
using System.Windows.Forms;

namespace ThreadTest
{
	public class WorkerThread
	{
		protected Thread _Thread;
		protected bool _StopRequest;

		public Thread GetThread {
			get { return _Thread; }
			set { _Thread = value; }
		}

		public bool StopRequest {
			set { _StopRequest = value; }
		}

		public string State {
			get {
				if ( _Thread != null )
					return _Thread.ThreadState.ToString();
				else
					return ThreadState.Unstarted.ToString();
			}
		}

		public WorkerThread() {
			_StopRequest = false;
		}

		public void StartThread() {
			if ( _Thread == null || ( _Thread != null && !_Thread.IsAlive ) ) {
				_StopRequest = false;

				_Thread = new Thread( new ThreadStart( Run ) );
				_Thread.Start();
			}
		}

		protected void Run() {
			try {
				while ( !_StopRequest ) Thread.Sleep( 0 );
			}
			catch {}
			finally {}
		}
	}
}
Code:
public static void Main() {
	WorkerThread thd = new WorkerThread();
	MessageBox.Show( "Thread State = " + thd.State.ToString() );
	thd.StartThread();
	System.Threading.Thread.Sleep(500);
	thd.StopRequest = true;
	MessageBox.Show( "Thread State = " + thd.State.ToString() );			
}
MfG, cosmo
 
Hallo, Danke für deine Antwort. Das ist ein schönes Beispiel, ich verstehe nur nicht ganz wie ich jetzt per Button diesen StopRequest setzen kann
Code:
while ( !_StopRequest ) Thread.Sleep( 0 );
			}
finally {}
		}
Ja ich weiß durch deine damaligen Vorschläge, habe ich auch bischen was zu den Thema gelernt und habe es jetzt ja schonmal hinbekommen das mein Programm mit einem Thread Funktioniert. Habe den Thread wie shcon erwähnt auch in einer While-Schleife gesetzt nur ich wußte/weiß nur eben nicht genau, wie ich mit meiner Form, per Button dieses bool auf false setzen kann der While-schleife, daß er das Thread unterbricht.
Nebnebi was bedeuet dieses finally {} ? Ist das ne leere Funktion, oder irgendein Befehl?

Grüße und Danke für deine Hilfe.
 
Fridulin hat gesagt.:
ich verstehe nur nicht ganz wie ich jetzt per Button diesen StopRequest setzen kann
In dem Ausführungs-Beispiel in der Main-Methode ist es doch zu sehen. Du kannst den Code auch in ein Button Event hineinkopieren. Vorher musst Du natürlich den WorkerThread im Form definieren.
Code:
private void btnStart_Click( object sender, EventArgs e ){
	thd = new WorkerThread();
	MessageBox.Show( "Thread State = " + thd.State.ToString() );
	thd.StartThread();
}
private void btnStopThread_Click(object sender, System.EventArgs e) {
	if ( thd != null ){
		thd.StopRequest = true;
		MessageBox.Show( "Thread State = " + thd.State.ToString() );
	}
}
Fridulin hat gesagt.:
Nebnebi was bedeuet dieses finally {} ? Ist das ne leere Funktion, oder irgendein Befehl?
Das sind Basics wie der Alex heute schon gesagt hat. Also lerne sie bitte :)
[thread=137203]try & catch - Thread[/thread]

MfG, cosmo
 
Achso ist das, jetzt habe selbst ich es kapiert. (hoffe ich) Stimmt darauf hätte ich auch selbst kommen können.

Vielen Dank für die Infos und viele Grüße
 
Und wenn Du jetzt noch ein Event in die WorkerThread Klasse einbaust, welches in der Run-Methode ausgelöst wird,
kannst Du eine Methode in deinem Form damit verknüpfen und hast somit deine erste eigene WorkerThread-Klasse gebaut
und bist hoffentlich nun in der Lage das WorkerThread StarterKit zu verstehen. :)
Wenn Du nämlich mit größeren Datenmengen arbeitest, wirst Du grantiert Probleme bekommen, weil die Zugriffe nicht Sysnchronisiert sind.

Machs gut, Fridulin.

MfG, cosmo
 
Hallo,

Zur weiteren Verwendung müsste ich der Klasse ja eine beliebige Funktion (Bsp. DoWork()) übergeben können ,damit diese abgearbeitet wird. Oder verstehe ich da was komplett falsch?

Gruß
Marc
 
Zurück