Ich habe in meiner Anwendung einen Nachrichtendienst eingebaut (könnte man als oneway-chat bezeichnen). Das heißt, alle aktiven Clients können eine Nachricht empfangen, die dann als Form auf geht. So schaut das Gerüst im Hauptform im Moment aus:
Imports System.Threading Public Class Form1 Dim listener As New Threading.Thread(AddressOf MyTcpListener.Main) listener.Start() End Class Public Class MyTcpListener Shared Sub Main() 'Hier wird auf die Nachricht gewartet Dim msgbx As New msg msgbx.TextBox1.Text = data msgbx.ShowDialog() End Sub End Class
Das heißt, im Formular msgbx gibt es eine Textbox, in der die Nachricht reingeschrieben wird. Der Nachteil an dieser Methode ist jedoch, dass keine weiteren Nachrichten empfangen werden können, bis die msgbx geschlossen wurde. Darum dachte ich, ich könnte das eigentlich über einen Thread im Thread lösen... im Zweifelsfall liegen halt mehrere der Forms übereinander. Versucht habe ich es mit
Dim msgbx As New msg msgbx.TextBox1.Text = data Dim msgbx_trd As New Threading.Thread(AddressOf msgbx.main) msgbx_trd.Start()
und im Form msg
Public Sub main() Me.Show() End Sub
gemacht. Allerdings blitzt die Form nur kurz auf und zerstört sich dann selbst. Wie bekomme ich das hin, dass das Formular von msg stehen bleibt, bis es geschlossen wird?
deine Form blitzt nur kurz auf, weil sich Dein Thread danach beendet. Erste Variante ist, du lässt die neuen Threads Ihren eigenen MessageLoop ausführen, d.h.
Public Sub main() Application.Run(Me) // Me ist doch der this-Zeiger in VB, oder? End Sub
Da kommen aber im Zweifel ziemlich viele Threads zusammen. Alternativ lässt Du das Ganze in einem einzigen auf diese Weise gestarteten Thread laufen, zeigst alle neuen Forms darin nicht-modal an und baust eine Kommunikation zu diesem Thread auf, um neue Fenster bei ihm anzufordern.
Naja, wenn du auch nur einen weiteren Thread machst ist das nicht so schön :) Die GUI sollte man immer versuche in einen Thread zu behalten. Um die Beschaffung der Daten und deren Verarbeitung können sich dann andere Threads kümmern.
die gesamte GUI sollte man immer im GUI-Thread belassen. Wenn du eine andere Logik parallel ausführen willst dann musst du es in einen Thread machen. D.h. du lädst die Daten im Thread und zeigst diese dann im Window an (welches aber dem GUI-Thread gehört).
Ein Grund ist mal, dass es mir immer so empfohlen wurde. Wenns blöd läuft dann kann es dazu führen dass die GUI trotzdem blockiert oder es können andere Phänomene auftreten. Aber ich habe es noch nie ausprobiert, deshalb kann ich dir nicht sagen welche Probleme da auftreten könnten ;)
Generell finde ich es einfach schöner wenn man da klar zwischen GUI und Arbeiter unterscheidet. Aber das ist bestimmt auch ein Stück weit Geschmackssache :)
P.S.: Ja, Me = this