Realisierung eines Statusfensters

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Realisierung eines Statusfensters

    Hallo,

    mein Programm öffnet bei aufwendigen Prozeduren eine art Statusform, auf der sich eine Textbox befindet, in der Meldungen erscheinen.
    Es handelt sich dabei um Fehlermeldungen oder Fortschrittsbenachrichtigungen, die während des Prozesses auftreten. Sie werden wie folgt überliefert:

    VB.NET-Quellcode

    1. Process_Status.processreport.appendText(Now.TimeOfDay.ToString & "/ Loading bla bla..." & vbNewLine)


    Das Problem ist nun, dass während diser Prozesse die gesamte Form hängt und man sie nicht verschieben kann und das ist ziemlich ärgerlich, wenn so ein Prozess mal mehrere Minuten dauert.
    Gibt es vielleicht eine Möglichkeit, dass man die Statusform in einem neuen Thread öffnet und dass dann die Meldungen auch threadübergreifend auf der eben dieser Form angezeigt werden?
    Im Normalfall würde man wohl besser die Prozesse in einem neuen Thread ausführen, jedoch wäre es für mich ein sehr viel größerer Aufwand das so umzusetzen.

    danke
    Hi
    gestalte Anwendungen zukünftig möglichst so, dass die Darstellung unabhängig von der Datenverarbeitung ist. Es sollte nach Möglichkeit völlig egal sein, was nach oben hin verändert wird, das interne Programm sollte immer unabhängig davon laufen können. Gui sollte nur auf Daten zurückgreifen und liefern; die Datenverarbeitung und Darstellung sollte möglichst ohne das auskommen. Alles in Gui-Klassen zu packen ist z.B. in den meisten Fällen ziemlich schlecht zu warten. Überleg' dir einfach, wie du dein Programm
    - möglichst wartbar
    - möglichst übersichtlich
    - möglichst schnell ergänzbar und veränderbar
    - über die Architektur möglichst performant, aber schnell entwickelbar (damit meine ich keine Optimierungen für einzelne Probleme, über die Architektur kann man schon das ein oder andere Problem beheben, was man sonst z.B. per Dictionary oder so lösen müsste)
    machen kannst. Es gibt nat. noch weitere wichtige Faktoren, aber ich denke mal, dass die oben in deinem Fall eher nicht so zutreffen. Zur Wartbarkeit gehört eben genau dein Fall.

    Was müsstest du alles verändern, um das Programm in einen anderen Thread auszulagern?

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Was müsstest du alles verändern, um das Programm in einen anderen Thread auszulagern?
    Sehr viel! Es sind sehr viele einzelne Funktionen/Subs, die während des Prozesses laufen. Teilweise werden auch Steuerelemente oder Variablen auf anderen Formen angesprochen.
    Das hier sind die Klassen in denen der Hauptteil der Prozesse abläuft, bei denen ein Statusfenster angezeigt wird:
    github.com/megasus/CharImport/…ster/CharImport/CoreFiles

    Die Funktionen werden wiederum in anderen Forms und Klassen aufgerufen.

    VB.NET-Quellcode

    1. Try
    2. bla = bla.Replace("...", "0")
    3. Catch
    4. End Try
    5. Try
    6. bla = bla.Replace("...", "0")
    7. Catch
    8. End Try
    9. '...

    bla.Replace kann bei einem gültigen String nur dann fehlschlagen, wenn bla Nothing ist und Replace mehrfach auf einen String anzuwenden ist eher auch nicht so, wobei meine Methode wahrscheinlich wieder mal ein Overkill wäre. Du kannst aber auch einfach auf z.B. einen StringBuilder zurückgreifen, statt immer einen neuen String anzulegen. Mach dir im Übrigen unbedingt einige Gedanken zu einer abstrakten Gestaltung des Projekts. Du hast bereits in einer einzigen Klasse mehr als 3000 Zeilen Code, die sich auf einen Bruchteil kürzen lassen, wenn du Vererbung verwenden würdest und das gehört zu OOP-Grundlagen. Wartungstechnisch wäre eine einfache Veränderung dann innerhalb von 30 Minuten locker machbar, bei dir wäre es eine Arbeit von mehreren Stunden.
    Insgesamt wäre es evtl. tatsächlich ratsam, so vorzugehen:
    - Backup machen
    - wenn noch nicht gemacht, in Vererbung einarbeiten und Architektur überlegen
    - Code, der komplexere Datenverarbeitung vornimmt in andere Klasse auslagern
    - nach und nach sämtliche Zugriffe auf Controls durch Variablen o.Ä. ersetzen, Vererbung usw. einbauen
    das macht aber sicher keinen Spaß, da du häufig keine 1 zu 1 Übertragung findest. Mir fällt allerdings keine Alternative ein, wenn nicht sonst jemand eine hat.
    Neuprogrammieren wäre sicherlich weniger Arbeit, als den Code auszubessern, vor allem, da du lange Passagen hast, die überwiegend das gleiche machen. D.h. über Vererbung lässt sich das schnell implementieren und evtl. auch die Performanz stark steigern.

    Ich hoff' ich nehm dir jetzt nicht den Spaß dran, wenn du das selber programmiert hast.

    Gruß
    ~blaze~