"Run" startet externes Programm sporadisch zweimal

  • Hallo!

    Ich lese schon eine ganze Zeit mit und konnte mir so schon einige Anregungen holen. Leider konnte ich mit der Suche zu meinem Problem nichts finden :(

    Den Script setze ich ein um ein Plugin, welches das LCD Display am Gehäuse steuert, nach dem Standby neuzustarten - sonst zeigt es nichts mehr an.

    Am Anfang habe ich das Plugin vor dem Standby geschlossen und beim Aufwachen wieder gestartet. Leider kam es vermehrt dazu, dass mehr als ein Prozess (Plugin) offen war und somit das Display auch nicht funktionierte. Den Grund dafür konnte ich nicht lokalisieren. Also habe ich alles in ein Script gepackt und lasse jetzt alle gleichnamigen Prozesse schließen um das Plugin dann erneut einmal zu starten.

    Das Problem ist jetzt, dass das Plugin sporadisch zweimal gestartet wird - wie gesagt nicht immer - und mehr als zweimal konnte ich auch noch nicht feststellen.

    Der Script sieht wie folgt aus:

    [autoit]

    AutoItSetOption ("WinTitleMatchMode", 2)

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

    While WinExists ("iMON VFD/LCD Plugin")

    WinClose ("iMON VFD/LCD Plugin")
    WEnd

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

    Sleep (2000)

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

    Run ("C:\Programme\System\iMONPlugin\IMONPlugin.exe")

    [/autoit]


    Vielleicht hat jemand eine Idee oder einen Ansatz, wie ich prüfen kann, dass mehr als ein Prozess gestartet wurde und ein erneutes killen der Prozesse / erneutes Ausführen veranlasst wird.
    Oder vielleicht kennt jemand das Problem mit dem doppelt ausführen!? :P

  • Vieleicht so:

    [autoit]


    While 1
    If Processexists ("prozess.exe") then
    ProcessClose ("prozess.exe")
    sleep (100)
    WEnd

    [/autoit]
  • Also müsste ich diese Schleife nach dem Starten ausführen? Das Problem ist, dass "ProcessClose" ungünstig ist, weil so nicht das Symbol im Systray verschwindet. Außerdem reicht es nicht einfach wenn zwei Prozesse offen sind einen davon zu schließen. Damit das Display korrekt funktioniert müssen beide Prozesse geschlossen werden und einer erneut geöffnet :S

    Eigendlich wäre es auch erstmal interessant zu wissen, warum das Plugin sporadisch zweimal durch den "Run" Befehl ausgeführt wird!? Gibt es eine Möglichkeit das irgendwie zu loggen um dahinterzukommen?

    Als Notlösung könnte es aber auch so gehen: (ich kann nur den Ablauf beschreiben, dass jetzt noch in einem script zu verwirklichen pack ich glaube ich noch nicht ganz.

    1. der von mir gepostete Script wird ausgeführt
    2. kurze Zeit später wird geprüft, ob mehr als ein Prozess offen ist
    3. wenn nicht, dann scriptende
    4. wenn ja, den von mir geposteten Script erneut ausführen
    5. anschließend wieder prüfen ....also eine Art Dauerschleife, bis wirklich nur ein Prozess / Fenster offen ist

  • Am "Run Befehl" liegt das nicht, möglicherweise ist die Fernbedienung etwas sensibel und führt bei einem langen Tastendruck die Befehle doppelt aus?

    Die Funktion _Singleton verhindert das doppelte Starten deines Skripts, vielleicht hilft auch etwas Feintunig der Fernbedienung?

    Alle Instanzen des Plugins kannst du so abschießen:

    [autoit]


    for $i = 1 to 3
    run("notepad.exe","", @SW_MAXIMIZE)
    next
    Sleep(2000) ;nur zum verdeutlichen
    while ProcessExists("notepad.exe")
    ProcessClose("notepad.exe")
    wend

    [/autoit]
  • Hm, den Scriptschnipsel versteh ich ni ganz. Damit wird doch nur 3 mal das Programm geöffnet um danach in der while-schleife alle wieder zu beenden, oder?
    Das hab ich vielleicht noch nicht gesagt: Der Script wird nicht durch die Fernbedienung ausgelöst, sondern nach dem Aufwachen aus dem Standby automatisch - also durch einen Trigger von einem anderen Programm. Das Problem ist auch nicht, dass der ganze Script mehrfach aufgerufen wird, weil der doch sonst jedes mal erst alle Prozesse schließen würde um einen neuen zu starten!? Demzufolge kann es doch nur an dem Inhalt meines Scriptes liegen, oder?

  • Hehe das ist natürlich nur ein beispiel.

    Möglicherweise startet sich das Plugin selbstständig?
    Run (...) startet ein Programm auf jeden Fall nicht grundlos zweimal und dein Skript endet ja auch nach der "Run-Zeile".

  • Also von allein startet sich das Plugin auch nicht...wenn ich den Script nicht ausführe, startet das Plugin nicht. Ja, ich kann mir auch nicht vorstellen, dass die "Run" Zeile was damit zu tun hat. Vielleicht ist es ja auch eine Fehlfunktion von dem Plugin!? Keine ahnung...ich weiß trotzdem noch nicht richtig wie ich die oben beschriebene Abfolge als "Workaround" in einem Script realisiere ?(

  • Hallo!

    Ich habe nun den Skript etwas erweitert.

    Ziel ist es, dass er wie weiter oben schon genannt, folgendes umsetzt:

    1. der von mir gepostete Script wird ausgeführt (die Funktion "Schl_St")
    2. kurze Zeit später wird geprüft, ob mehr als ein Prozess offen ist
    3. wenn nicht, dann scriptende
    4. wenn ja, den von mir geposteten Script erneut ausführen
    5. anschließend wieder prüfen ....also eine Art Dauerschleife, bis wirklich nur ein Prozess / Fenster offen ist

    [autoit]

    AutoItSetOption ("WinTitleMatchMode", 2)

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

    Schl_St()

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

    While $list[0][0] > 1

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

    Schl_St()
    WEnd

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

    Func Schl_St()

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

    While WinExists ("iMON VFD/LCD Plugin")

    WinClose ("iMON VFD/LCD Plugin")
    WEnd

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

    Sleep (2000)

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

    Run ("C:\Programme\System\iMONPlugin\IMONPlugin.exe")

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

    Sleep (4000)

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

    $list = ProcessList("iMONPlugin.exe")

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

    EndFunc

    [/autoit]

    Leider funktioniert es nicht. Als Warnung bekomme ich folgenden Meldung "WARNING: $list: possibly used before declaration."

    Ich dachte, dass die Funktion am Anfang einmal ausgeführt wird und somit am Ende der Funktion auch die Prozesse gezählt und in "$list" abgelegt werden, bevor die Schleife

    [autoit]

    While $list[0][0] > 1

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

    Schl_St()
    WEnd

    [/autoit]


    durchlaufen wird!?

    Könnte mir da bitte jemand auf die Sprünge helfen?

  • Ich behaupte, das Problem liegt darin, dass WinClose nicht immer zuverlässig funktionert, bzw. sich die Prozesse nicht so gerne schließen lassen.
    Probiers mal mit WinKill
    Oder am besten mit ProcessClose. Das Plugin besteht aus zwei Prozessen? dann beende doch beide mit ProcessClose.

    L3viathan2142

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Wenn Du eine Variable innerhalb einer Funktion benutzt, ist es automatisch eine lokale Variable. Es sei denn, Du deklarierst diese vorher als Global.
    Ein:

    [autoit]

    Global $list

    [/autoit]


    am Anfang Deines Scripts sollte das Problem lösen.

    Danke, das war die Lösung - nun funktioniert der Script wie gewollt!


    L3viathan2142: Mag sein, dass es daran liegt...ProcessClose oder Winkill möchte ich aber nicht nehmen, da damit das Icon im Tray nicht mit geschlossen wird und sich so immer mehr dort ansammeln ;)