Programmoberfläche nach "Shown" sichtbar, aber einige Sekunden nicht bedienbar, weil Threads noch werkeln

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    Programmoberfläche nach "Shown" sichtbar, aber einige Sekunden nicht bedienbar, weil Threads noch werkeln

    Hi Ihr,

    habe noch einen Schönheitsfehler in meiner Anwendung.
    Nachdem "Load" und "Shown" durchgelaufen sind und damit die Form auf dem Desktop angezeigt ist, laufen noch einige Threads (siehe - Anlage - ), welche die Bedienung meiner Anwendung solange blockieren, bis diese abgeschlossen sind und dann erst die Sanduhr verschwindet.
    Bei meiner Anwendung sind das fast 10 Sekunden.

    Nun würde ich gerne die Form solange hiden, bis diese Threads abgearbeitet sind.
    Kann - und wenn ja - ich das so hinfummeln?

    Mir sind diese Threads nicht bekannt, da ausser der Einbindung des CEFSharp-Browsers eigentlich alle Aktivitäten synchron laufen und meine Anwendung daher beim Beenden des Shown frei für Useraktivitäten sein sollte.
    Kann ich meine Anwendung irgendwie auf das Verwerfen dieser Threads warten lassen, bevor ich diese sichtbar schalte?

    Beste Grüsse
    Bilder
    • 2024-09-24 19_13_41-ICE - Ideal Clipboard Expander (Debugging) - Microsoft Visual Studio.jpg

      57,29 kB, 840×248, 23 mal angesehen
    Hi @Haudruferzappeltnoch,

    Ja, da hast ganz recht. :)

    Aber dafür habe ich jetzt ein "Bitte-Warten-Fenster" in meine Anwendung gebastelt, welches verschwindet, sobald die Anwendung geöffnet und sichtbar ist.
    Nur ist dann "sichtbar" eben leider gleichzeitig auch nicht "bedienbar".
    Ich hätte daher gerne das "Bitte-Warten-Fenster" solange angezeigt und die Mainform versteckt, bis diese auch bedient werden kann.
    Hi @Coldfire,

    ich verstehe Deine Antwort leider nicht.

    Das Problem habe ich im Post 1 beschrieben.
    Nach dem Start des Programms lasse ich mit "Opacity = 0" das Mainform verstecken und stattdessen ein "Bitte warten"-Fenster anzeigen, welches autom. geschlossen wird, wenn der Shown-Handler abgearbeitet ist und die Form dann mit "Opacity = 1" sichtbar gemacht wird.
    Leider dauert es danach aber noch weitere 10 sek. bis der User das Mainform bedienen kann, da solange mir nicht bekannte Threads abgearbeitet werden.
    Erst dann kann der User im Mainform herumklickern.
    Was ich suche, ist also eine Möglichkeit, mein "Bitte warten"-Fenster erst dann zu schliessen, wenn die genannten unbekannten Startthreads verworfen sind und der Benutzer somit tatsächlich das Mainform bedienen kann.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()

    Unbekannte Startthreads? Das dir hin und wieder mal in der Ausgabe angezeigt wird das threads beendet wurden ist normal. Aber wenn dein UI nicht sofort reagiert liegt es entweder an Third Party Komponenten die den UI Thread blockieren oder an deinem Code. Ich habe auch schon den CEF-Sharp Browser verwendet, aber solche freezes hatte ich nicht, hab eben auch mal ein Projekt angelegt und das Nuget Packet genommen. Der Chromiumbrowser blockiert nichts, wird mir sofort die gewollte Webseite angezeigt, starten und anzeigen der Webseite dauert keine viertel Sekunde, hab zwar die Zeit nicht gemessen, aber es geht so flott, da machts wenig Sinn.

    Ich habe auch Projekte in denen ich einen Splashscreens mit Ladefortschritt zeige, weil unmengen an Daten geladen werden, aber mein UI reagiert immer sofort, du wirst irgendwas haben was da blockiert.

    Hast du viel zu laden beim starten? Vorallem IO-Operationen können ganz schön bremsen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @Dideldum Ein Thread blockiert normalerweise die GUI nicht.
    Kann es sein, dass Deine Threads permanent invoken, um die GUI up-zu-daten?
    Dann sollten die Threads die Daten sammeln und final genau ein Mal invoken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich kann zum Problem erstmal nix beisteuern, aber ich hab auch ein paar Anwendungen, bei denen zu Programmstart Daten geladen und verarbeitet werden müssen. Diese werden nebenläufig verarbeitet. Trotzdem erscheint das GUI sofort, ist aber auf Enabled = False gesetzt und ein fettes Label mit der Aufschrift Bitte warten, Daten werden geladen. macht dem User klar, was Sache ist. Nach dem Laden wird das GUI auf Enabled = True gesetzt und das Hinweis-Label ausgeblendet.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi Ihr,

    @DTF, @RodFromGermany, @VaporiZed - Besten danke für Eure Infos :)
    Ich habe mit dem Timer festgestellt, dass die seltsame Verzögerung alle Threads und Tasks der Anwendung für einige Sekunden blockiert.

    Daher habe ich jetzt im Timer eine Verzögerung von 7 Sekunden ab Programmstart eingebaut.
    Erst nach Ablauf dieser Zeitspanne wird das "Bitte warten-Fenster", welches im Load-Handler aufgerufen wird, ausgeblendet und die Mainform enabled.
    Solange die Zeit nicht abgelaufen ist, wird zwar im Shown-Handler das Mainform angezeigt, aber disabled und eben mit dem "Warten-Fenster".

    Damit kann ich leben. ;)

    Nur warum das ganze Programm nach dem Durchlaufen des Shown-Handlers für ca. 5 Sek. einfriert, ist mir schleierhaft.

    Beste Grüsse
    Setz doch mal haltepunkte in deinem Code der dann ausgeführt wird, so findest du evtl. raus wo es lange dauert., merkst ja wenn ein Breakpoint erreicht wurde, dann mit F5 weiter und schauen wo es klemmt. Dauerts von einem zum anderen entsprechen lang, bist du nah dran, bzw. hast 2 Punkte zwischen denen du schauen kannst.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    Oder einfach mal während der Wartezeit die Debug-Pausetaste anklicken. Die Wahrscheinlichkeit ist doch recht hoch, dass Du bei der Anweisung rauskommst, die da vor sich hinwerkelt. Auch könntest Du - um den Vorpost zu präzisieren - zu Beginn und am Ende des Load- und Shown-Events Haltepunkte machen, dann wird Dir beim Debuggen und Erreichen der Haltepunkte gezeigt, wie lange es von einem Punkt zum nächsten dauert, siehe Anhang.
    Bilder
    • Dauer.png

      14,28 kB, 708×71, 18 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi @DTF und @VaporiZed,

    danke für Eure Tips. :)
    Die Blockade tritt erst nach dem Abarbeiten des Shown-Handlers auf.
    Also dann, wenn eigentlich nur noch der Timer dauernd laufen sollte.
    Die Durchlaufzeiten vom Load- und Shown-Handler sind akzeptabel.

    Das ist es ja, warum ich dem Einfrieren nicht näher komme.

    Äh... Was ist die "Debug-Pause"-Taste?
    Diese Funktion kenne ich nicht - hört sich aber vielversprechend an. :D
    siehe Anhang
    Bilder
    • Pause.png

      32,53 kB, 842×221, 17 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.