| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

ich möchte beim Klick auf einen Button aus dem Hauptform heraus eine Klasse mit eigenständigem Formular starten. Dazu habe ich erst mal das (natürlich in Ausschnitten):

Public Class Form1
Dim trd As Threading.Thread = Nothing
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
If trd Is Nothing Then
second = new New Threading.Thread(AddressOf second.main)
second.IsBackground = True
second.Start()
End If
End Sub
End Class

Schnipsel aus der zweiten Klasse:
Public Class second
Public Sub main()
Application.Run(Me)
Me.TopMost = False
Me.BringToFront()
Me.ShowInTaskbar = True
End Sub
Private Sub second_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
GC.Collect()
Me.Dispose()
e.Cancel = False
End Sub
End Class


Das neue Formular wird also beim Klicken wunderbar gestartet. Jetzt habe ich nur das Problem, dass ich es nicht hinbekomme, das Ding beim Schließen auf das X rechts oben wieder zu entfernen. Das FormClosing-Event stoppt zwar den Thread, schmeißt ihn aber nicht weg. Wie bekomme ich das hin, dass das Formular/der Thread nur gestartet wird, wenn er noch nicht läuft und nach dem Beenden wieder gestartet werden kann?
News:
05.06.2012
muffi 1,4k 1 9
Was würde dagegen sprechen, das 2. Formular via .Show() aufzurufen? Wieso muss es ein Thread sein?
Karill Endusa 05.06.2012
1 Antwort
2
Probier mal Application.ExitThread. Ansonsten stimme ich aber Karills Kommentar zu: warum nicht einfach Show aufrufen?
05.06.2012
Matthias Hlawatsch 13,2k 4 9
Mit ExitThread ganz am Ende des Closing-Events schaut es gut aus. Grünes Hackerl, Danke! :-)
Warum ich das als als Thread laufen lasse: ich koppel in dem Formular absichtlich aus dem Hauptthread aus, damit die Hauptanwendung damit nichts zu tun hat und etwas anderes anstellen kann.
muffi 05.06.2012
Was auch kein Problem wäre, wenn die 2. Form per Show() aufgerufen werden würde...
Karill Endusa 05.06.2012
Du machst mich gerade neugierig... so lange werkel ich noch nicht mit Threads - eher im Anfängerstadium. Wie sieht die Alternative mit .Show() aus, wenn es ein eigener Thread sein soll?
muffi 05.06.2012
Das ist ja grad das, was mich stutzig macht: Wieso solltest du einen eigenen Thread für eine 2. Form brauchen?
Wenn Form2 Klassenweit in Form1 deklariert ist und du Form2 dann mit .Show() aufrufst, ist Form2 eine eigenständige Form und nur Anhand ihrer Referenz abhängig von Form1 (was aber beim Thread nicht wirklich anders ist). Meinem Verständnis nach wird also kein zusätzlicher Thread für die 2. Form benötigt.
Karill Endusa 05.06.2012
Gegenfrage: warum soll es ein eigener Thread sein? Show zeigt ein Form an, ohne zu blockieren, d.h. mit einem einzigen (UI-)Thread kannst Du ohne weiteres mehrere Formulare laufen lassen. Es gibt ein paar gute Gründe, es so zu machen, und auch ein oder zwei für die Variante mit mehreren UI-Threads. Mach eine neue Frage auf, wenn Du da weiter in die Details gehen willst.
Matthias Hlawatsch 05.06.2012
Ach, jetzt verstehen wir uns. Dass ich Form2 als Thread laufen lasse, hat schlicht den Hintergrund, dass dort Berechnungen laufen (längere Laufzeiten), für die ein Thread eben ideal ist. Das Form2 an sich fungiert da eher als Statusmonitor.
muffi 05.06.2012
OK. Dann ist der zweite UI-Thread zumindest konzeptionell der falsche Ansatz (auch wenn er bei Dir möglicherweise funktioniert). Du solltest die Berechnungen stattdessen in einem Background-Thread laufen lassen und von dort aus hin und wieder Form2 aus aktualisieren. Die BackgroundWorker-Komponente hilft Dir dabei.
Deine Lösung verschiebt das Problem eigentlich nur: Du vermeidest zwar, den "Haupt"-UI-Thread zu blockieren, blockierst dafür aber den UI-Thread für das zweite Formular. Eine gute Lösung hält aber das ganze UI "live".
Matthias Hlawatsch 05.06.2012
Wenn du längere Berechnungen im Hintergrund machen willst ohne die UI zu blockieren, dann kannst du vielleicht besser den BackgroundWorker verwenden. Der ist eigentlich für solche Zwecke da.
multi1209 05.06.2012
BackgroundWorker hört sich beim Googeln ganz gut an, ich werde in die Richtung mal lesen. Soll nicht mehr Thema dieses Threads sein. Könnte eine Alternative für mein Problem sein, wenngleich ich mit dem Thread eigentlich im Moment (auch vom Programmkonzept her) recht zufrieden bin.
muffi 05.06.2012

Stelle deine .net-Frage jetzt!