Laden...

Thread - IsAlive switcht nicht auf false

Erstellt von Sera vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.198 Views
S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 14 Jahren
Thread - IsAlive switcht nicht auf false

Eigentlich sollte ein Thread beendet werden, nachdem alle Befehle in der Threadmethode abgearbeitet wurden. Trotzdem habe ich eine while(x.IsAlive) Abfrage, die leider gegen unendlich geht. Warum wird IsAlive nicht auf "false" gesetzt?

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Sera,

mehr Kontext bitte. Wer startet wen, wer macht was?
Btw.: Folgendes läuft einwandfrei (nach 5 sec) ohne Endlosschleife durch.

Thread thread = new Thread(() => { Thread.Sleep(5000); });
thread.Start();

while (thread.IsAlive)
	;

Gruß,
dN!3L

P.S.: while(x.IsAlive) ist eine ganz schlechte Idee. Dafür gibt's doch extra Synchronisierungsobjekte!

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 14 Jahren

hi dn,

Hab es getestet, ja das geht. Ich hatte ein Event gestartet und auf die Mainform delegiert. Das war der Grund. Muss ich unbedingt die Main Form invoken um das zu umgehen? Main Thread != DLL Thread.

2.891 Beiträge seit 2004
vor 14 Jahren

Ich hatte ein Event gestartet und auf die Mainform delegiert. Das war der Grund. Muss ich unbedingt die Main Form invoken um das zu umgehen? Main Thread != DLL Thread.

Häh? Ein bisschen mehr Text könnte schon sein. Meine USB-Glaskugel ist gerade kaputt...

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 14 Jahren

Die Threadmethode hat einen Eventdistributor inkludiert, der das Event "Ich bin fertig" an seine Subscriber liefert.

Ein Subscriber ist die Mainform selbst, wo ich ein Label in dieser Methode fülle. Ich habe den Eventteil gelöscht und nun funktioniert die IsAlive Abfrage.

2.891 Beiträge seit 2004
vor 14 Jahren

Ein Subscriber ist die Mainform selbst, wo ich ein Label in dieser Methode fülle. Ich habe den Eventteil gelöscht und nun funktioniert die IsAlive Abfrage.

Hm, also eine detaillierte Beschreibung ist das immer noch nicht...
Versuchen sich irgendwelche Eventhandler mit dem Hauptthread zu synchronisieren (Control.Invoke)? Die laufen erst durch, wenn der Hauptthread Zeit dafür hat. Und die hat er nicht, weil er in while (thread.IsActive) steckt (wie gesagt, ganz blöde Idee. Schonmal nach Mutex/Semaphoren oder BackgroundWorker geguckt?). Also ein schöner Lifelock.

Gruß,
dN!3L

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 14 Jahren

ok, ist mir auch noch nicht geholfen.

Stimmt immer noch etwas nicht.

DLL

Threadmethode
Eventhandler

Mainform

Subscriber des Events

Thread delegiert "Ich bin fertig" an subscriber.

Mainform registriert, daß Thread ein Event geschickt hat. Nun will ich das Label innerhalb der Eventmethode aktualisieren. Stillstand! Endlosschleife -> IsAlive = true

Ich muss also das Label per Invoke füllen?

2.891 Beiträge seit 2004
vor 14 Jahren

Dreimal habe ich es gesagt, langsam reicht's.
Mehr Kontext bitte! Wer macht wann was?

Rumgerate bringt nichts. Code schon eher.

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 14 Jahren

Wofür Code? Ich hab ein Crossthreading Problem. Ein Thread soll ein Control meines MainThreads modifizieren. Sieht nach Async Probs aus.

Will nicht offensiv wirken, dn, aber dennoch danke für deine Hilfe.

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 14 Jahren

So, ist gelöst. Backgroundworker als Wirt.

2.891 Beiträge seit 2004
vor 14 Jahren

Ich hab ein Crossthreading Problem. [...] Sieht nach Async Probs aus.

Und genau das ist das Problem. Du rätst irgendwas, und wir können hier noch viel weniger helfen, da wir wenige bis gar keine Infos haben, was du da programmiert hast.
Klar könnte man mehrere Dinge raten, an denen es liegt, aber bringt ja nichts (für dich).

Ein Thread soll ein Control meines MainThreads modifizieren.

Controls kann einzig und allein der Hauptthread (der, der sie auch erstellt hat) modifizieren. Aus anderen Threads muss man über Invoke gehen. Aber sowas führt nicht zu Lifelocks, sondern zu Exceptions. Aber das ist auch alles nur Gerate ohne handfeste Informationen.

Gruß,
dN!3L

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 14 Jahren

Klar, dn. Nur ist es nicht mein Code, Events werden aus fremden Threads gestartet und der Progger denkt das geht. Wäre eine Idee gewesen und ich in meiner Motivation eine Background Worker Geschichte hingepfuscht, da diese gerade so schön reinpasst.