Progressbar beim laden der GUI

  • Hallo AutoIT'ler,

    ich habe meinem Skript so geschrieben, dass bevor die eigentliche GUI aufgeht, ein "Lade-GUI" mit Bootlogo kommt und darunter eine Progressbar.

    Momentan wird die Progressbar einfach nur mit einer Schleife gefüllt und anschliessend geht die GUI auf. So gesehen ist es derzeit eigentlich nur eine optische Verzögerung beim Start.

    Jedoch war mein eigentlicher Gedanke, dass die Progressbar als Ladebalken gehen soll bis die HauptGui aufgeht. Bei uns in der Arbeit sind die Netzlaufwerke sehr langsam, so das es einige Zeit dauert bis sich die GUI öffnet - daher wollte ich die Progressbar machen, damit man sieht wie weit der Ladevorgang schon ist.

    Bisher finde ich imemr nur Progressbars in Verbindung mit FileCopy oder Downloadstatus etc. Aber nichts um den Ladestand eines Programmes wiederzugeben.

    Mein Start erfolgt derzeit so:

    [autoit]


    #Region Animated Boot Logo
    FileInstall("M:\Agents\CT Profis\751076\wikiportable\Wiki.jpg", @TempDir & "\wiki.jpg", 1)
    $boot = GUICreate ("Loading Wiki... | Bitte warten... | Please wait...", 500, 600,-1, 20)
    GUICtrlCreatePic(@TempDir & "\wiki.jpg", 0, 0, 500, 600)
    WinSetOnTop($boot,"",1)
    DllCall ( "user32.dll", "int", "AnimateWindow", "hwnd", $boot, "int", 2000, "long", 0x00080000 );fade-in
    $frmmain = GUICreate("Loading...", 600, 24, -1, 665, BitOr($WS_SYSMENU,$WS_POPUP,$WS_CLIPSIBLINGS))
    $pgbar = GUICtrlCreateProgress(0, 0, 600, 24)
    GUISetState()
    For $i = 1 To 102 Step 3
    $zahl = 100 / 100 * $i
    GUICtrlSetData($pgbar,$zahl)
    Sleep(50)
    Next
    Sleep(1000)
    DllCall ( "user32.dll", "int", "AnimateWindow", "hwnd", $boot, "int", 1000, "long", 0x00090000 );fade-out
    GUIDelete($boot)
    GUIDelete($frmmain)
    #EndRegion Animated Boot Logo

    [/autoit]

    Hier sieht man wie die Progressbar gefüllt wird - ich möchte es aber mit dem Ladefortschritt der MainGui koppeln. Geht das oder kann ich den Gedanken vergessen?

    LG
    Mirko

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Musst du denn unbedingt GENAU wissen , wann das Fenster erscheint, oder reicht da nicht die Info , dass es gerade geladen wird?

    Spoiler anzeigen
    [autoit]


    SplashTextOn("Loading...","GUI is loading...",150,50)

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode",1)

    [/autoit] [autoit][/autoit] [autoit]

    $hwnd = GUICreate ("GUI", 250, 250)
    GUISetOnEvent(-3,"_Exit")
    Sleep(5000) ; Simuliert deine Wartezeit :D
    GUISetState()
    SplashOff()

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(20)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

  • Moin, Netzlaufwerke sind total langsam? ich glaube da solltet ihr mal eure Leitungen erneuern 10m/bit für 50 PC's? XD
    naja zum Prob zurück, dar es sich um Netzlaufwerke handelt (ich schätze Mappen von mehreren Laufwerken) würde ich nach jedem Mapping zb die % erhöhen bei 4 nach jedem Mapping m 25% usw..
    sollte es aber um etwas anderes handeln wäre es gut wen du uns genauer erklären könntest was dein Script überhaupt macht..

    Gruß Marvin

  • Das klingt interessant, würde mich auch interessieren...
    Man müsste, wenn ich`s richtig verstehe, hinbekommen, das immer wieder abgefragt wird wie weit die "Haupt GUI" ist...

    Ist sicherlich nicht die eleganteste Lösung, doch ich würds vermutlich so versuchen, das die Haupt-GUI den "Progress" iwo hinschreibt, so dass die "Lade-GUI" einfach nur abfragt ob/und welchen Status die Datei/Inhalt hat und das an den "Balken" weitergibt... 8|

    Jaaa.. verwirrend, hab aber atm keine Ahnung wie ich anders erklären soll was ich meine :D

  • Hm also Mikes vorschlag klingt sehr interessant - die Frage ist wie dieser umzusetzen wäre. Er hat aber von meinem vorhaben den Nagel auf den Kopf getroffen.

    @Protex: Thema Netzlaufwerke :D

    Ich arbeite hier in Deutschland für ein amerikanisches Unternehmen. Die Netzlaufwerke gehen nach Brüssel auf einen Knotenpunkt und dort weiter nach Memphis in die USA - und das dauert. Auf dem Netzlaufwerk sharen wir auch nur ein paar unserer Dateien als Backup... der Rest ist lokal.

    Aber nun BTT - siehe Mike sein Vorschlag. Meine GUI wird geöffnet, ein paar Tabs erstellt und dort etliche Labels/Editfelder geschrieben. Ganz zum schluss wird dann der GuiSetState Befehl angegeben um die GUI anzuzeigen. Ich hatte anfangs den SetState-Befehl früher im Skript, jedoch baute sich dann der Inhalt des GUI's immer erst auf. Das wollte ich nicht - ich wollte das die GUI erst sichtbar ist, wenn alles geladen ist.

    Und da das teilweise dauert wollte ich die Ladezeit mit dem Progressbar anzeigen.

    Die Splashfunktion die oben angesprochen wurde nützt mir nix da das Sleep auch den aufbau der GUI um die angegebene Zeit verzögert. Den Progressbar würde ich lieber vorziehen.

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • mirko2002 , also solltet ihr interesse daran haben die Verbindung zu beschleunigen google mal nach "Riverbed" wir haben die Systeme bei uns im Einsatz weil wir auch viele Aussenstellen haben usw.. naja wie auch immer..

    Zum Aufbau deiner GUI werden also Daten via Netzwerk bezogen? je nachdem was du über das Netz beziehst könntest du dir ja errechnen wie lange es dauert ähnlich wie bei einem Download .. der eigentliche GUI aufbau dauert ja nur wenige MS...

    Gruß Marvin

  • Hallo Marvin,

    nein ganz so ist es nicht ;)

    Da lokal ab und zu mal Dateien bei uns beschädigt sind oder durch irgendwelche Updates auf einmal weg sind, zerschossen oder was auch immer, hatte ich mich dafür entschieden, die au3 mit all den Files (Bilder die per Fileinstall reinkommen) auf dem Netzlaufwerk zu erstellen.

    Also statt c:\ liegen nun alle Daten auf M:\ - wenn ich jetzt zum Beispiel im Skript was ändere und die AU3 mit F5 starten will dauert es auch immer eine halbe ewigkeit bis das Skript geladen ist - manchmal denkt man einfach das es abgestürzt ist, weil es solange dauert. Die exe wird dann ebenfalls auf M:\ kompiliert, so das jeder meiner Kollegen die exe also direkt über das Netzlaufwerk aus startet und nicht lokal von der eigenen Platte...

    Hoffe das ist verständlich. Kann es nicht besser beschreiben ;)

    Gruß
    Mirko

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Alsoo ist es so sobald du die EXE Kompilierst packst du alle Sofware, Daten usw in die EXE. D.H. deine EXE ist nachher 1 GB Groß oder so^^ ,
    ich finde eine bessere Lösung wäre es die benötigten Daten einfach zu Kopieren, und sie nicht in die EXE zu integrieren.
    Also beim Start kannst du ja die benötigten Daten in ein Verzeichniss (Lokal) kopieren bzw vorher prüfen ob die Daten vill schon kopiert wurden (bei einem start zuvor) etc..
    Und den Download der Daten kannst du wiederrum in einer Progressbar darstellen, nur das Kopieren braucht ja die lange Zeit die au3 brauch ja nich mal eine Sekunde..


    // hoffe ich hab das alles soweit richtig verstanden^^

    Gruß Marvin

  • man könnte es über zwischenspeicher machen und abfragen ob laufwerk so und so da ist und dann den balken einen schritt vorwärts laufen lassen^^ ist natürlich nicht flüssig

    PS: ich hab mir nicht alles durchgelesen, tötet mich bitte nicht wenn ich was falsches geschrieben hab^^

  • Hehe, das blöde ist nur, das wenn das Netz eh schon "lahmt", auch noch den Zwischenspeicher "abzunerven", ist sicher kontraproduktiv, bzw. noch langsamer :P

  • nee mit zwischenspeicher meinte ich die funktion laufwerke zu laden geben ja ein resultat oder @error zurück wie auch immer
    und dieses fragst du ab und schreibst in eine variable...hat ja im ganzen nichts mit dem verarbeiten der laufwerke zu tun. und am ende machst eine prograssbar mit abfrage nach einzellnen variablen dann haste deine schritte

  • Versteift euch jetzt bitte nicht zu sehr auf meine Aussage mit dem Netzlaufwerk ;)

    Die jetzige kompilierte EXE ist 1,3 MB groß und wird max., wenn sie fertig ist, vielleicht 4 MB haben - also nicht die Welt.

    Man muß sich nur vorstellen das, wenn ich mir die EXE auf den lokalen Desktop kopiere, dass das dann schon gut 30 Sekunden dauern kann - für 1,3MB wohlgemerkt.

    so hat man evtl eine Vorstellung wie langsam das abläuft.

    Ich kann genausogut die exe auf meinem lokalen Desktop ausführen - jedoch würde ich auch da (auch wenns da erheblich schneller lädt) diesen Ladebalken gerne bekommen. Und da erscheint mir Mike seine Lösung am sinnvollsten. Weiß aber selber auch nicht wie man das umsetzen kann :D

    Evtl einfach ne variable erstellen die anfangs 0 ist und der Progressbalken halt 0% anzeigt (über If - then) und vielleicht 500 Zeilen tiefer die gleiche Variable dann mit 33 angibt und dann wieder auf die progressbar abgibt..

    So würde ich mir das vorstellen. Würde das mit der variable so gehen?

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • um das mal alles abzukürzen ...

    Dein Script/exe wird erst in dem Moment etwas tun (auch einen Ladebalken anzeigen),
    wenn das gesamte Script auf dem Rechner geladen ist.
    D.h. die Einzige Möglichkeit ist:
    ein kleines Boot-Script für den Ladebalken.
    Wenn dieses geladen ist wird damit der Ladebalken generiert und angezeigt.
    Dieses lädt dann die eigentliche Exe lokal auf den Rechner.
    Diesen Vorgang kann man messen und auch im Ladebalken anzeigen.
    Das Gap des ersten Aufruf's musst Du mit Geduld ausgleichen ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Mal ganz blöd gefragt, könnte man mit InetGetSize und InetGetInfo was werden ??
    Die "Haupt-GUI" wird ja quasi auf die lokale "Kiste" geladen....

    Quasi so, das Per "Lade-GUI" die "Haupt-GUI" gestartet wird, dabei via ( InetGetInfo )geprüft wird wie gross die Datei ist
    und der "Download" per ( InetGetInfo ) nebenbei überwacht wird wie "gross" die bisher geladenen Daten sind und dieses dann an die Progressbar "petzt" ... ?(

    Manchmal wundere ich mich selbst über meine querdenkerei :D

    #EDIT: Drauf gekommen bin ich durch Progressbar | Download ;)

  • ich hätte mich vielleicht genauer ausdrücken sollen.
    Aber genau das meinte ich ;)

    Zitat

    Diesen Vorgang kann man messen und auch im Ladebalken anzeigen.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)