Pausieren eines Scriptes ?

  • Auch wenn ich Neu hier bin, habe ich schon einige Projekte mit AutoIt geschrieben/ realisiert.

    Bisher bin ich fast immer mit der Hilfe (Deutsch oder Englisch) oder Lesen/ Surfen im Internet/ hier im Forum weitergekommen (manchmal auch ganz schön viel probieren und zeitaufwändig).

    Heute habe ich ein Frage zum Pausieren von Scripten:

    1. Im Tray ist das Symbol von AutoIt mit dem man die Ausführung des Scriptes anhalten und fortsetzen kann.

    (Ich weiß, daß man das mit "Opt" auch verändern, z.B. deaktivieren kann - das will ich aber gar nicht !)

    Kann man das Klicken zum Anhalten und Fortsetzen auch über die Tastatur machen ?

    Das wäre für den Fall praktisch, daß das Fenster im maximierten/ Vollbildmodus ist, und mit WinSetOnTop immer im Vordergrund gehalten wird. Da kann/ soll es unter Umst#änden passieren, daß man die Taskleiste nicht mehr sieht.

    2. Ich habe hier ein Script, daß mir via "Send"-Befehl jede Menge URL's automatisch in Firefox lädt. Jeweils mit 3 Sekunden ("Sleep 3000") Pause. Die 3 Sekunden reichen zum Laden und zum Ansehen. (Ich kann die aber auch über ein Menü verändern).

    Nach dem Pausieren des Scriptes, laufen die "Send"-Befehle aber ins Leere, da kein Fenster aktiv ist, weil der Mauszeiger auf den Tray zeigt.

    Wie kann ich erreichen, daß nach dem Pausieren und Wieder-Fortsetzen des Scriptes das letzte Fenster bzw. ein bestimmtes Fenster (in diesem Fall 'Firefox') wieder aktiv wird ?

    Theoretisch müsste ich vor jeden "Send"-Befehl einen WinSetActive-Befehl einfügen, der das Fenster (im Beispiel: Firefox) aktiviert.

    Oder gibt es da eine elegantere Möglichkeit ?

  • Wozu werden die URLs alle drei Sekunden geladen?

    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.

  • Sinn und Zweck ist es, die URL's automatisch hintereinander zu laden. (Also nicht immer die Gleiche, die aktualisiert wird). z.B. um Nachrichten oder Wetterberichte in einer Art Diashow anzusehen.
    3 Sekunden habe ich jetzt mal als Beispiel genommen. Ich könnte auch 5 oder 6 Sekunden nehmen.
    (Dafür habe ich am Anfang des Scriptes ein Menü mit Zeitabfrage).
    Das reicht normalerweise aus, um die Seite zu betrachten.
    Wenn ich die Seite länger sehen will (was seltener vorkommt), dann halte ich das Script eben an, und lasse es bei Zeiten weiterlaufen.

    Ich könnte natürlich eine MsgBox vor jedem neuen Laden erstellen, daß ich erst auf "Weiter" klicken muss, bevor die nächste URL geladen wird. Aber das soll ja eigentlich vollautomatisch ablaufen.

  • Ich habe hier in diesem Thread: [ offen ] In Script Pause eine Lösung gefunden.
    Das funktioniert absolut perfekt.
    Leider weiß ich nicht ganz, was das include macht, und was die DLL-Befehle ausführen.
    Besonders die Variabelen _pause und _ispressed sind interessant. Naja, ich weiß halt gerne, was ich mache.
    Ich will ja auch was lernen.

    Bleibt noch die Frage, wie man das Fenster immer aktiv hält.
    Man weiß ja vorher nie, an welcher Stelle das Script irgendwann mal angehalten werden KÖNNTE.
    Anschließend soll das Fenster ja wieder aktiv sein.

  • Wie wärs mal wenn du dein Script posten würdest?

    Mir ist nämlich absolut unklar, warum du Befehle wie send() benötigst und warum das Fenster von Firefox aktiv gehalten werden muss. Zum einen gibt es für die Firefox Automatisierung die ff.au3 und ein komplettes Unterforum dafür ( https://autoit.de/index.php?page=Board&boardID=32 ), zum anderen liefert dir Autoit standardmässig bereits Funktionen für die Automatisierung des Internetexplorers. Beide Varianten erlauben dir nicht nur die Steuerung des jeweiligen Browsers (völlig egal ob dieser sichtbar, unsichtbar, im Vorder- oder Hintergrund ist), sie erlauben dir sogar das Browserfenster in deine eigene GUI einzubetten. Du brauchst auch nicht zwingend einen Hotkey um das Script zu pausieren, du könntest genauso gut einen Pausebutton einbauen, der z.B. eingeblendet wird wenn du deine Maus bewegst (vergleiche diverse Videoplayer oder Diashows).

    Nun zu deinen weiteren Fragen bezüglich der Pause Funktion von oben:

    Zitat

    Leider weiß ich nicht ganz, was das include macht, und was die DLL-Befehle ausführen.


    das Include "misc.au3" wird für die Funktion

    [autoit]

    _ispressed(...)

    [/autoit]

    benötigt. Wenn du dir die Hilfe dazu anschaust wirst du feststellen, dass die Funktion eine DLL (Standard user32.dll) benötigt. Wenn man diese nicht selbst per Handle übergibt wird diese bei jedem Funktionsaufruf geöffnet und geschlossen. Das kostet sehr viel Performanz, deswegen wird im Thread wo du diese Funktion gefunden hast die DLL einmalig geöffnet und an die Funktion übergeben. Im dortigen Thread fehlt aber ein Aufruf von

    [autoit]

    dllclose($dll)

    [/autoit]

    bei Programmende. Das sollte man nach Möglichkeit nicht vergessen. Wenn du genau wissen willst was die Funktion _ispressed() nun mit der DLL anstellt um magische Dinge wie Tastendrücke zu ermitteln schau in den Autoitincludeordner und bewundere die "misc.au3".


    Zitat

    Besonders die Variabelen _pause und _ispressed sind interessant. Naja, ich weiß halt gerne, was ich mache.
    Ich will ja auch was lernen.


    Da du was lernen willst:
    _pause() und _ispressed() sind keine Variablen sondern Funktionen. Was _ispressed() macht kannst du ja der Hilfe entnehmen. Was _pause() macht sollte bereits der Name offenbaren. Sie macht solange nichts ( sleep() ) bis eine bestimmte Taste gedrückt wird, danach gehts wieder dorthin wo die Funktion aufgerufen wurde.


    Zitat


    Bleibt noch die Frage, wie man das Fenster immer aktiv hält.
    Man weiß ja vorher nie, an welcher Stelle das Script irgendwann mal angehalten werden KÖNNTE.
    Anschließend soll das Fenster ja wieder aktiv sein.


    Siehe oben. Schau dir bitte die entsprechenden Funktionen zur Browserautomatisierung an. Ein Blick in die Hilfe zu folgenden Funktionen sollte deine Frage aber dennoch beantworten:

    [autoit]


    winactivate(...)
    winsetontop(...)

    [/autoit]
  • nur ergänzend zur Pause Funktion (habe das auch von hier), bzw, wie das ohne include machbar ist:

    Spoiler anzeigen

    HotkeySet("{PAUSE}","_pause")
    $pause=False
    ...
    ...
    ...

    Func _pause()
    $pause= Not $pause
    If Not $pause then Return
    Do
    Sleep(300)
    ToolTip('Das Script pausiert gerade', 0, 0); Kannst du freilich weglassen.
    Until not $pause
    EndFunc

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (3. Mai 2014 um 10:52)


  • Eigentlich solltest du inzwischen ja wissen wie man hier Quellcode richtig postet...

    • [Blockierte Grafik: http://i.imgur.com/0Ad5mrS.png]
    • sinnvollerweise nur bei mehr als 20 Zeilen

    • Formatierten Autoit Quellcode zwischen den Autoit BBcodes einfügen
  • Du hast Recht misterspeed, ich sollte es wissen, habe es aber nicht gewusst. Die meiste Zeit habt ihr mir Code gezeigt ;)

    Tatsächlich, habe ich nicht den Reiter Quellcode gewählt sondern einfach so meinen hineinkopierten Code als Autoit-Code markiert. Das Ergebnis sah ernüchternd aus. Alles war in einer Zeile. Daher habe ich dann einen Spoiler verwendet..

    Also Sorry und danke für den Hinweis. Ich konnte den wirklich gebrauchen.
    Wiederholung:

    [autoit]


    HotkeySet("{PAUSE}","_pause"); Hier wird die Pause-Taste der Tastatur verwendet. Daher auch {}, aber die Send Befehle kennst du ja.
    $pause=False
    ...
    ...
    ...

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

    Func _pause()
    $pause= Not $pause
    If Not $pause then Return
    Do
    Sleep(300)
    ToolTip('Das Script pausiert gerade', 0, 0); Kannst du freilich weglassen.
    Until not $pause
    EndFunc

    [/autoit]

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (3. Mai 2014 um 11:35)

  • Erstmal: DANKE für die vielen Antworten !

    Das mit dllclose habe ich mal eingefügt (wenn es laut Beschreibung von Autoit auch nicht unbedingt notwendig ist).

    Das es sowas wie eine FF.au3 gibt, habe ich nicht gewusst. Ich bin grade dabei, mich damit auseinanderzusetzen. Das war gar ncht so einfach die FF.au3 zum Laufen zu bringen (Mozrepl starten usw.).

    Letzten Endes hatte die herkömmliche Programmierung mit den Send-Befehlen auch zu dem gleichen Zeil geführt. Mit _FFOpenUrl kann man das natürlich etwas eleganter lösen. So einen Befehl hatte ich bei Autoit selbst gesucht und vermisst. Dafür muss man recht umständlich erst eine Verbindung zu Firefox herstellen.
    Also noch ein paar Test's (Debug) und dann sollte die Sache heute oder morgen laufen.

  • So einen Befehl hatte ich bei Autoit selbst gesucht und vermisst.

    Wie gesagt gibt bereits integrierte Funktionen für den Internetexplorer, dann spart man sich den Aufwand den man für Firefox betreiben muss und hat zudem eine Lösung die auf allen Windowsrechnern funktioniert, unabhängig davon ob Firefox und Mozrepl installiert sind.

    Mit _FFOpenUrl kann man das natürlich etwas eleganter lösen.

    Das wäre die entsprechende Funktion für den IE:

    [autoit]

    _IENavigate

    [/autoit]