Laden...

Beim Beenden eines Threads hängt das GUI

Erstellt von Console32 vor 12 Jahren Letzter Beitrag vor 12 Jahren 724 Views
Thema geschlossen
C
Console32 Themenstarter:in
258 Beiträge seit 2011
vor 12 Jahren
Beim Beenden eines Threads hängt das GUI

Hallo Community

Ich habe ein Problem mit dem beenden eines Threads:

Der Thread sieht in etwa so aus:

try
            {
                this.m_Running = true;
                while (this.m_Running)
                {
                    this.GetValues();
                    this.Refresh();

                    System.Threading.Thread.Sleep(100);
                }
            }

und beim Beenden (FormClosing event)

  private void Form_2_FormClosing(object sender, FormClosingEventArgs e)
        {
            End();
        }

        private void End()
        {
            this.m_Running = false;
            Thread.Sleep(300);


            while (this.m_oThread.IsAlive) 
            {
                Thread.Sleep(50);
            }


        }

Das Überschriebene Refresh ändert ein paar Pictureboxen nach den Werten von GetValues und ruft dann über ein Delegate die Basisklasse auf um das Paintereigniss der Oberfläche auszulössen. Da ich andere Werte der Oberfläche über das Paint ereigniss ändere.

Das problem ist das delegate, wenn ich das delegate weglasse funktioniert es einwandfrei.

Mit delegate hängt er in der schleife fest, und der oben genannte Thread macht nichts mehr!

wär schön wenn mir jemand Helfen könnte.
mfg
Console

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Console32,

du darfst im GUI-Thread nicht warten. Thread.Sleep ist schon schlecht (verboten), zumindest wenn es mehr als 50ms dauert. while (IsAlive) setzt da nochmal deutlich einen drauf und führt genau zu dem Deadlock, weil das GUI blockiert ist, der Thread aber auf das GUI wartet. Also warten die gegenseitig. Also ein echtes KO-Kriterium.

Lass den Thread einfach ein eigenes Event feuern, wenn er fertig ist ([FAQ] Eigenen Event definieren) und mach da den Rest (wobei natürlich wieder [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) zu beachten ist). Das FormClosing kannst du ja erstmal abbrechen.

Das haben wir oft genug besprochen. Alles wichtige findest du eh in der FAQ.

herbivore

Thema geschlossen