Entwickler-Ecke
WinForms - Ein Control entfernen (Control arbeitet mit Multithreading)
C# - Do 15.12.11 20:34
Titel: Ein Control entfernen (Control arbeitet mit Multithreading)
Hey Leute,
ich habe mal wieder eine Frage: Wie kann ich aus meiner Form ein Control entfernen dass mit Multithreading arbeitet? Wenn möglich ohne extra eine Methode zum herunterfahren aufrufen zu müssen.
Ich habe es mittels des Disposed Events probiert. Aber dies wird nicht aufgerufen wenn ich das Control entferne (mit Controls.Remove(xyz)) und auch nicht wenn ich vorher die Dispose()-Methode direkt aufrufe.
Hat jemand eine Idee?
Th69 - Do 15.12.11 21:34
Hallo C#,
der Aufruf mit Controls.Remove() reicht aus, um das Control aus der Collection (und vom Bildschirm) zu löschen. Ein Aufruf mit Dispose() nachher ist nicht unbedingt notwendig (denn wenn der GC dann das Control abräumt - solange es nicht noch irgendwo anders referenziert wird - ruft es dann automatisch intern die Dispose()-Methode auf).
Wie genau rufst du denn die Remove-Methode auf? Und um was für ein Control handelt es sich?
Aber was genau meinst du mit "Control arbeitet mit Multithreading", denn WinForms-Controls sind nur im GUI-Thread benutzbar (und demnach NICHT multithreading-fähig).
C# - Sa 17.12.11 19:09
Das Control hab ich selbst gemacht (ich nenne es jetzt mal "ObservingBrick"). Es ist eine Klasse die als Interface ein Panel benutzt. Und dort arbeite ich eben mit Multi-Threading. Meine WinForm beinhaltet ein FlownLayoutPanel, dass eine unbestimmte Anzahl von ObservingBricks.
Der ObservingBrick hat unteranderem ein Button mit dem Text "Löschen". Und nun rufe ich in meiner WinForm das DeleteBut.Click()-Ereignis ab.
In dieser Methode wird dann auch der ObservingBrick aus dem FlownLayoutPanel entfernt aber wenn ich dann die Anwendung schließe, schließt sich zwar das Fenster aber die Threads meiner gelöschten ObservingBricks sind immer noch aktiv wenn ich das richtig gesehen habe.
Th69 - So 18.12.11 11:25
Hallo,
bezogen auf deine Threads: verwendest du denn Vorder- oder Hintergrundthreads (s.
Thread.IsBackground-Eigenschaft [
http://msdn.microsoft.com/de-de/library/system.threading.thread.isbackground.aspx]?
Per Default ist IsBackground auf 'false' gesetzt, d.h. ein Vordergrundthread. Und nur Hintergrundthreads (d.h. IsBackground = true) verhindern, daß der Hauptprozess sich beendet.
Trotzdem kommt mir das Arbeiten mit Controls und Multithreading bei dir etwas komisch vor.
Könntest du mal deine relevanten Teile der ObservingBrick-Klasse mal zeigen (d.h. Klassenkopf, Konstruktor sowie den Thread.Start und die relevanten Teile der Hauptschleife deines Threads).
Oder noch besser gefragt, was soll die ObservingBrick-Klasse denn leisten?
C# - So 18.12.11 12:06
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public Motor(...) { nxtObserver = new Thread(NxtObserving); propertyObserver = new Thread(PropertyObserving); nxtObserver.Start(); propertyObserver.Start(); threads = new List<Thread> { nxtObserver, propertyObserver }; } |
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:
| private void PropertyObserving() { while (!Disposing && !Closed) { NameBox.Text = LocalName; PortBox.Text = Port.ToString().Remove(0,4); if (Observe && !nxtObserver.IsAlive) { threads.Remove(nxtObserver); nxtObserver = new Thread(NxtObserving); nxtObserver.Start(); threads.Add(nxtObserver); } if (ManualUpdating && Observe) ManualUpdating = false; if (ManualUpdating != manualUpdateCache && ManualUpdating) { Size = bigBox; Controls.Add(UpdateButton); manualUpdateCache = ManualUpdating; } else if (!ManualUpdating) { Size = smallBox; Controls.Remove(UpdateButton); manualUpdateCache = ManualUpdating; } } } |
So sieht das ganze aus. Der andere Thread hat die gleiche While-Schleife, ist aber ansonsten noch leer.
C# - So 18.12.11 14:11
Ok. Ich probier zukünftig mal Backgroundworker. Aber ich hab sowieso ne andere Lösung gefunden. Die Library die ich eingebunden hab stellt ein Event dafür bereit was ich machen will.
Tortzdem danke, ich werde mir den Artikel durchlesen.
Ich bin übrigends immer für Verbesseringsvorschläge offen.
Th69 - So 18.12.11 14:41
Das ist sehr gut, denn dies sehe ich als Grundvoraussetzung für einen guten Entwickler ;-)
C# - So 18.12.11 14:45
Sehr gut ;). Ich hab nämlich vor nach meiner Ausblidung Informatik zu studieren.
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!