Konzeptfrage / StdoutRead

  • Hallo zusammen, zuerst mal Entschuldigung für die lange Frage!

    Ich muss mit AutoIt (interne) Software automatisch installieren und zeige dabei gleichzeitig das Bild des Produktes an, solange die Installation dauert.
    Das alles funktioniert einwandfrei!

    Doch ich möchte es etwas verbessern! Bisheriges Vorgehen ist das folgende (Pseudocode):
    While 1
    - Bilder in GUI mittels GUICtrlSetImage updaten
    - Prüfen ob Programm schon vorhanden und korrekt installiert ist
    - Wenn nicht, Silent Installation starten
    WEnd

    Das Problem ist nun, dass das Updaten des Bilder "zu lange" dauert. Nämlich dann, wenn das Programm schon vorhanden ist, könnte ich viel schneller weitergehen.
    Mein Programm wird momentan weltweit eingesetzt und wird alle 30 Minuten ausgeführt. Es werden 152 Programme installiert / überprüft.
    Die 30 Minuten kommen nicht von mir, sondern das sind Konzernvorgaben! Auch ist Vorgabe, dass sie "irgendwelche Bilder" während des Installation / Prüfung sehen wollen.

    Ich habe mal die Bildanzeige ausgeschaltet und das Programm war in 4.8 Sekunden fertig! (Wenn nichts installiert werden musste.)
    Mit den 152 (lokal gespeicherten) Bildern geht es ca. 32 Sekunden.

    Leider kann ich nicht im Hintergrund (ohne GUI) überprüfen, ob ein Programm installiert werden muss, und erst dann die GUI anzeigen.
    Begründung: Es könnte ja sein, dass die erste und die letzte Installation fehlt. Dann würde das GUI kurz aufgehen, installieren, verschwinden und kurz darauf wieder erscheinen.
    Das verwirrt die Benutzer. Sie wollen sehen, dass die Bilder kurz "durchfliegen".

    Ich habe mir gedacht, dass ich die GUI in eine seperate EXE Datei auslagere und irgendwie per StdoutRead kommuniziere, welches Bild (und Text) angezeigt werden soll.
    Aber wie kann ich in der GUI-Exe den StdoutRead benutzen, wenn das Installationsprogramm selber die GUI-Exe aufruft?

    Der Vorteil wäre, dass wenn es länger dauert, bis das Bild gesetzt ist, dass dann gewisse Bilder einfach übersprungen und nicht angezeigt werden. Im GUI-Exe würde ich einfach immer wenn Zeit vorhanden, den StdoutRead Stream lesen. Und wenn er dann gewisse Bilder "übersieht" wäre mir das recht!

    Für Vorschläge und Inputs wäre ich dankbar!
    Veronesi

    Einmal editiert, zuletzt von veronesi (11. März 2011 um 15:43)

  • Prüfe doch vorab nach welche Programm installiert werden müssen und startest dann nur die zu installierenden Programme. Schau die mal mein Softwareverteilungstool an: https://autoit.de/index.php?page=Thread&threadID=17111 da wird es ähnlich gemacht nur halt nicht lokal sondern über Server.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo Chip,

    leider wollen das die "Chefs" nicht. Sie wollen sehen, wie die Bilder durchflitzen.
    Es ist schwierig zu erklären, doch wenn mal zwischendurch ein Bild bei der Anzeige fehlt (aus Zeitgründen) so ist das weniger tragisch (auch weil die Augen gar nicht so schnell sind), als wenn sie dann z.B. nur 1 oder 2 Bilder sehen.

    Ich hoffe, ich konnte es genügend klar erklären.

  • Also du willst alle 152 angezeigt haben auch wenn nicht alle installier werden sondern z.b. nur 3?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ja, genau das.
    Wobei "alle" eben relativ ist. Wenn die Bilder so schnell vorbeiflitzen, dass es der Benutzer gar nicht merkt, ist es mir egal, wenn anstatt 152 "nur" 70 angezeigt werden.
    Das kriegt der Benutzer in dieser kurzen Zeit gar nicht mit!

    Aber wenn in dieser Zeit nur 3 angezeigt würden, merkt er das schon! Und dann hat er das Gefühl, es sei etwas schief gelaufen und man habe ihm nur 3 Tools installiert.
    Einfach die Bildanzeige soll die eigentliche Installation (welche ja viel wichtiger ist) nicht ausbremsen!

    Ich weiss, etwas kompliziert, aber hoffentlich ist es nun klarer.

  • Ich habe mal nun einen Test gemacht. Das Hauptprogramm schreibt in eine temporäre Datei den Bildnamen rein. Die GUI-Exe liest so schnell sie kann, die Datei aus und stellt bei Änderungen das Bild dar.

    Es funktioniert. Gewisse Bilder werden dabei "übersprungen", weil die Bilddarstellung manchmal langsamer ist, als die eigentliche Installation.
    Soweit so gut, doch ich bin nicht ganz glücklich damit, dass im Millisekundenbereich eine temporäre Datei geschrieben werden muss...

    Anderst gefragt: Gibt es eine Möglichkeit, eine Funktion erst auszuführen, wenn eine andere Funktion länger als z.B. 200ms dauert?
    Klar, ich kann mit

    [autoit]

    AdlibRegister("CheckTime", 100)

    [/autoit]

    arbeiten und bei jeder Installation einen Timer starten. Die AdlibRegister funktion prüft dann alle 100ms den Timer. Steht er bei 200ms, dann das Bild darstellen.

    Aber so elegant ist das nicht! Ich befürchte, dass ich mein Programm mehr belaste mit all den Timern!

  • Und schon wieder eine Frage:
    Falls ich AdlibRegister verwenden würde: Wird der Befehl RunWait dann überhaupt unterbrochen?

    Ich starte mit diesem Befehl die Installationen und warte auf die Rückkehr (weil ich den ExitCode benötige)

  • Vielleicht noch ein anderer Ansatz, erzeuge aus den 152 Bildern eine großes Bild bei dem die 152 Bilder nebeineinander angeordner sind. Dann verschiede einfach das Bild je nach Status auf der GUi ein Stück weiter so dass das nächste Programmbild sichtbar wird. Dann würde nur die beginn die Grafik in die GUi geladen und es gäbe keine weitere Verzögerung durch das nachladen der Bilder.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo Chip!
    Das ist ein interessanter Ansatz!

    Ich weiss jetzt aber noch nicht recht, ob ich das machen möchte, denn bei 152 Bildern à 800x515 pixel ergibt das eine stattliche Grösse.
    Zudem kommen wöchentlich Tools dazu und manchmal verschwindet auch eines.

    Trotzdem danke! Einen Gedanken ist es wert!

  • Oder noch eine Idee, lade bevor die die GUi anzeigen lässt alle Bilder in seperate GUICtrlCreatePic die exakt übereinander liegen und verstecke sie mit GUICtrlSetState(-1, $GUI_HIDE). Dann brauchst einfach nur die Bilder nacheinander wieder einzublenden.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hmm, meinst Du, das bringt mir etwas an Geschwindigkeit?

    Eigentlich wollte ich ja, dass ich nicht zwingend alle Bilder laden muss. Sagen wir nur diejenigen, für welche die Installation bzw. Überprüfung auf diesem Rechner länger als 200ms dauert. Welche Installationen das sind, ist von Rechner zu Rechner unterschiedlich!

    Wie lange dauert es, bis 5MB Bilder so geladen und vorbereitet sind?

    Edit: also alle Bilder zusammen sind 5MB!

  • Hallo Chip!
    Nicht übel! Die Idee scheint mir gar nicht so schlecht! Ich lese alle Bilder in ein Array und erstelle je ein GUICtrlCreatePic.
    Das laden dauert auf meinem PC 1,6 Sekunden für die 152 Bilder. Danach kann ich sie so schnell durchlaufen lassen, dass ich fast gar keines sehe ;)

    Vielen Dank!