| 

.NET C# Java Javascript Exception

4
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?
News:
07.09.2011
muffi 1,4k 1 9
3 Antworten
3
Hallo muffi,

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.

Viel Erfolg,
Florian
07.09.2011
ffordermaier 8,4k 3 9
Das passt... Danke! Und: normalerweise dürften da nicht viele Threads starten. Ich bin der Einzige, der die Nachrichten versenden darf.

P.S.: Ja, Me = this
muffi 07.09.2011
1
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.
michlG 07.09.2011
4
Hallo,

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).

Dabei musst du aber darauf achten dass du keinen Threadübergreifenden Vorgang machst.
Guckst du hier: Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)


PS: Zeig das Chat Fenster besser mit Show an als mit ShowDialog, sonst kann man immer nur mit einem Mensch chatten.

Gruß
Michael
07.09.2011
michlG 1,7k 1 5
Hast Du Gründe dafür, warum nur ein MessageLoop pro Prozess laufen sollte?
ffordermaier 07.09.2011
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 :)
michlG 07.09.2011
2
Bin mir nicht sicher, ob das, was Du vorhast, eine gute Idee ist - aber probier doch mal

Application.Run(Me); // statt Me.Show()
07.09.2011
Matthias Hlawatsch 13,2k 4 9

Stelle deine .net-Frage jetzt!