Hallo, für eine Ethernet Anwendung habe ich eine Klasse erstellt, die alle gewünschten Funktionalitäten abbildet. Nun möchte ich Daten von dieser Klasse nach außen an die GUI weiterreichen. Die Klasse beinhaltet einen Threading.Timer. Wie können die Daten an die GUI weitergereicht werden? Welche Vorgehensweise wäre dafür geeignet?
eine Message an die GUI schicken und diese zeigt sie dann man Hauptthread an.
Wäre es besser in die GUI Applikation einen Windows.Timers.Timer zu verwenden oder doch einen eigenen Thread für die grafische Ausgabe?
Wenn du das in eigene Threads packst wird es kompliziert, ermöglicht aber ein Blockierungsfreies Arbeiten. Was bei .Net Anwendungen wichtig ist, dass GUI Controls nur von dem Thread modifiziert, aktualisiert und gezeichnet werden die dieses Control auch erstellt haben (Bedeutet, den Konstruktor aufgerufen) Dein Thread für die Gui darf sich deshalb nicht beenden. Wenn du einen eigenen Thread für die GUI nimmst, darfst du den nur mit sleep schlafen lassen. Mit Application.DoEvents kannst du dann den GUIThread die Events bearbeiten lassen. eine Typische Schleife für die GUI würde so aussehen:
1 | Form1 frm = new Form1(); |
2 | frm.show(); |
3 | while(!exit){ |
4 | Application.DoEvents(); |
5 | System.Threading.Thread.sleep(10); |
6 | }
|
Einfacher ist es, ein Standard Projekt mit Form zu machen und für deinen Netzwerkcode ein eigenen Thread zu erstellen. Bei den Timerevents bin ich mir nicht sicher, aber wenn ich mich richtig erinnere werden die Timer events in dem Thread bearbeitet in dem der Timer auch erstellt wurde. Solange der Thread im Timerevent ist, ist dieser Thread blockiert und kann keine GUI events ausführen. Aus dem Fremden Thread kannst du mit der invoke Funktion Funktionen mit dem GUI Thread aufrufen. Viele Grü?e
MVVM und ein View Model lebt im GUI Thread und implementiert die Synchronisation oder https://msdn.microsoft.com/en-us/library/ms171728%28v=vs.90%29.aspx (Version beachten - der Beispielcode ist Steckenweise verschieden)
> eine Typische Schleife für die GUI würde so aussehen: >
1 | Form1 frm = new |
2 | > Form1(); |
3 | > frm.show(); |
4 | > while(!exit){ |
5 | > Application.DoEvents(); |
6 | > System.Threading.Thread.sleep(10); |
7 | > } |
Bitte hör auf so einen Schrott zu posten, das ist einfach alles nur kompletter Blödsinn. Das hat man vielleicht bei VB6 noch so gemacht, aber ganz bestimmt nicht mehr seit in unserer Jahreszahl eine 2 davor ist... Nun zum Thema: Ich würde die Daten aus deiner Klasse einfach per Event verteilen, dann kann die Gui damit machen was sie will. Ob WinForms oder WPF ist dann eigentlich egal und deine Netzwerk Klasse ist und bleibt schön gekapselt...
Hallo Günter, vielen Dank für deinen Beitrag. Wie meinst du das genau mit Events verteilen? Könntest du ein Beispiel dazu machen?
user schrieb: > vielen Dank für deinen Beitrag. Wie meinst du das genau mit Events > verteilen? Du verpaßt deiner Klasse einfach ein paar öffentliche Events, mittels derer sie alle relevanten Änderungen ihres Status nach außen meldet. An diese Events kann sich dann dranhängen wer immer das will. Probleme bezüglich des Multithreading muß aber denn immer derjenige lösen, der sich an diese Events ankoppelt. Solange es dabei immer nur um die Synchronisation mit deim Haupthread der Anwendung und dem darin laufenden GUI geht, ist das fast immer ziemlich trivial, weil nahezu alle GUI-Komponenten von Control erben und damit auch dessen Methoden InvokeRequired und Invoke bzw. BeginInvoke.
Hallo, wie funktioniert das mit den öffentlichen Events? Sollen die öffentlichen Daten in einem Event verpackt werden? Mir würde ein kleines Beispiel dazu sehr helfen. Wo lässt sich im Netz so ein Beispiel beziehen?
Brauchst du generell eine Einführung in Events? http://www.codeproject.com/Articles/11541/The-Simplest-C-Events-Example-Imaginable
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.