Forum: PC-Programmierung C# GUI Applikation


von user (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

eine Message an die GUI schicken und diese zeigt sie dann man 
Hauptthread an.

von user (Gast)


Lesenswert?

Wäre es besser in die GUI Applikation einen Windows.Timers.Timer zu 
verwenden oder doch einen eigenen Thread für die grafische Ausgabe?

von Dennis R. (dennis_r93)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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)

von Günter R. (muntablues)


Lesenswert?

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

von user (Gast)


Lesenswert?

Hallo Günter,

vielen Dank für deinen Beitrag. Wie meinst du das genau mit Events 
verteilen? Könntest du ein Beispiel dazu machen?

von bluppdidupp (Gast)


Lesenswert?


von c-hater (Gast)


Lesenswert?

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.

von user (Gast)


Lesenswert?

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?

von bluppdidupp (Gast)


Lesenswert?


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
Noch kein Account? Hier anmelden.