none
Zeige Prozess im WPF GUI aus anderer Klasse / Object RRS feed

  • Frage

  • Hallo zusammen,

    ich bin relativ neu in C# besonders was die GUI Dinge angeht.

    Ich bin gerade dabei ein Programm zu kreieren, welches mir mehrere Maschinen simulieren soll. Jede Maschine hat unter anderen die Funktion "schalteEin". Diese Funktion benötigt bei jeder Maschine unterschiedlich lang.

    Aktuell habe ich es ermöglicht, dass durch Verwendung des BackgrundWorkers alle Maschinen gleichzeitig angeschaltet werden können und der Prozessstatus im GUI ausgegeben wird. Jedoch habe ich alles in der Main-Klasse hinterlegt. Da ich bisher noch keinen Lösungsansatz finden konnte wie ich diese Funktionen in ihrer jeweiligigen Klasse unterbringen konnte.

    Sprich in der Main bzw. im GUI ist ein Button der Maschine einschaltet. Vorher wurde die Maschine bereits als Object angelegt und hat die Funktion "schalte ein". Die Dauer hierfür wird bereits im Konstruktor vorgegeben. Beim Klick auf den Btn soll nun schalte ein ausgeführt werden und angezeigt werden wie lange es noch dauert, bzw wie viel Zeit abgelaufen ist.

    Für Ratschläge, Tips und verweise auf Tutorials währe ich sehr verbunden.

    Gruß, Timo

    Montag, 21. September 2015 06:45

Antworten

  • Hi Timo,
    zuerst sollte geklärt werden, um wie viele Maschinen es sich maximal handelt. Wenn es wenige Maschinen sind, dann kann jede Maschinen in einem separaten thread verwaltet werden. Wenn es viele Maschinen sind, dann kann eine zentrale Verwaltung der Ereignisse effizienter sein.

    Anhand Deiner kurzen Aufgabenbeschreibung würde ich das so lösen:

    1. Verwaltungsklasse (Dispatcher), der die Liste aller Maschinen verwaltet und als Geschäftslogik für die zentrale Oberfläche fungiert (z.B. als ViewModel in einer WPF-Anwendung).

    2. Klasse Maschine, die entweder alle Maschinen beschreibt, wenn sie alle ein gleiches Verhalten haben oder als Basisklasse für verschiedene Maschinen dienen kann, wenn jeder Maschinentyp teilweise abweichendes Verhalten implementieren muss.

    3. Jede Maschinenklasse implementiert einen Zustandsautomaten. Wenn jede Maschine in einem separaten thread laufen soll, dann arbeitet die Maschinenklasse alle Zeitereignisse selbständig ab. Andernfalls informiert die Maschinenklasse die Verwaltungsklasse über den Zeitpunkt des nächsten Zustandsüberganges.

    4. Die Verwaltungsklasse bekommt von der Maschine (Objekt vom Typ der Maschinenklasse) Ereignisse, die dann ausgewertet bzw. angezeigt werden.

    5. Jede Maschinen verweist auf ein UserControl, was zur Anzeige genutzt wird. Das UserControl ist an die konkrete Maschine (ViewModel) gebunden und stellt deren Zustand dar.

    6. Wenn mit zentraler Verwaltung der Ereignisse gearbeitet wird (nicht jede Maschine in einem eigenen thread), dann greift die Verwaltungsklasse auf die Liste der Maschinen so sortiert zu, dass der nächste Zeitpunkt ermittelt wird, wo eine Maschine seinen Zustand ändert. Zum ermittelten Zeitpunkt wird in der Maschine wird eine Methode aufgerufen, die den Zustandsautomaten in den nächsten Zustand überführt.


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Mr.Timo Montag, 21. September 2015 12:26
    Montag, 21. September 2015 07:28

Alle Antworten

  • Hi Timo,
    zuerst sollte geklärt werden, um wie viele Maschinen es sich maximal handelt. Wenn es wenige Maschinen sind, dann kann jede Maschinen in einem separaten thread verwaltet werden. Wenn es viele Maschinen sind, dann kann eine zentrale Verwaltung der Ereignisse effizienter sein.

    Anhand Deiner kurzen Aufgabenbeschreibung würde ich das so lösen:

    1. Verwaltungsklasse (Dispatcher), der die Liste aller Maschinen verwaltet und als Geschäftslogik für die zentrale Oberfläche fungiert (z.B. als ViewModel in einer WPF-Anwendung).

    2. Klasse Maschine, die entweder alle Maschinen beschreibt, wenn sie alle ein gleiches Verhalten haben oder als Basisklasse für verschiedene Maschinen dienen kann, wenn jeder Maschinentyp teilweise abweichendes Verhalten implementieren muss.

    3. Jede Maschinenklasse implementiert einen Zustandsautomaten. Wenn jede Maschine in einem separaten thread laufen soll, dann arbeitet die Maschinenklasse alle Zeitereignisse selbständig ab. Andernfalls informiert die Maschinenklasse die Verwaltungsklasse über den Zeitpunkt des nächsten Zustandsüberganges.

    4. Die Verwaltungsklasse bekommt von der Maschine (Objekt vom Typ der Maschinenklasse) Ereignisse, die dann ausgewertet bzw. angezeigt werden.

    5. Jede Maschinen verweist auf ein UserControl, was zur Anzeige genutzt wird. Das UserControl ist an die konkrete Maschine (ViewModel) gebunden und stellt deren Zustand dar.

    6. Wenn mit zentraler Verwaltung der Ereignisse gearbeitet wird (nicht jede Maschine in einem eigenen thread), dann greift die Verwaltungsklasse auf die Liste der Maschinen so sortiert zu, dass der nächste Zeitpunkt ermittelt wird, wo eine Maschine seinen Zustand ändert. Zum ermittelten Zeitpunkt wird in der Maschine wird eine Methode aufgerufen, die den Zustandsautomaten in den nächsten Zustand überführt.


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Mr.Timo Montag, 21. September 2015 12:26
    Montag, 21. September 2015 07:28
  • Hallo Peter,

    vielen Dank für deine Antwort. Diese hat mich genau in die Richtung geleitet die ich nicht gefunden habe

    Es handelt sich aktuell nur um 4 Maschinen unterschiedlicher Typen. da für die Funktionen nur Zeiten heruntergezählt werden müssen werde ich die Funktionen in einem neuen Thread laufen lassen. Also maximal 4+1 gleichzeitig.

    Das mit der zentralen Verwaltung werde ich aber mal im Hinterkopf behalten und mich damit auseinander setzten sobald ich die Zeit dazu finde. Das war auch meine erste Idee, wusste aber bisher und immer noch nicht wie ich das gelöst bekomme.

    Gruß und nochmal Danke,

    Timo

    Montag, 21. September 2015 12:26