Mehrere Instanzen eines Programmes

  • Hallo zusammen,
    in meiner 'Not' wende ich mich mal wieder hier an das Forum.
    (anmerken möchte ich, dass ich sowohl hier im Forum als auch allgemein dem Problem schon geraume Zeit nachgehe und leider zu keiner Lösung komme, vllt. ja auch zu dumm)


    Problem:
    Ein als .exe kompiliertes AutoIT Script wird im zum erstenmal gestartet (das Prog ist eine Art Log - ist aber letztlich egal) und nistet sich ausschliesslich als TrayIcon in den SystemTray (die möglichen Aktionen innerhalb des Programms werden dort über ein Tray Menue durchgeführt - also nix Active and/or Existing Window)

    Nun gibt es die seltene Situation das diesselbe .exe nochmal gestartet werden soll/muss. Um versehentliches Starten zu verhindern bzw. zumindest auf den Umstand hinzuweisen, würde ich dies gerne dem Anwender mitteilen. Nach dem Motto: Die Anwendung läuft schon, willst du wirklich diese nochmals starten.

    Und genau hier komme ich nicht so recht weiter:

    Im aufgeführten Snip ist alles schön, bis auf die Tatsache, das die Prüfung (natürlich) beim Starten der 2. Instanz wieder durchlaufen wird und 'fragt',
    was nach dem Bestätigen des erneuten Startens unschön ist.

    Irgendwie drehe ich mich da im Kreis - weiss jemand Rat oder hätte einen Tip ???

    Spoiler anzeigen


    If _Singleton("cdeZeiterfassung.exe", 1) = 0 Then
    $cdeInstance = MsgBox(36,"Das Programm läuft bereits", "Eine Instanz der EXE läuft bereits!" & @CRLF & "Wollen Sie tatsächlich eine weitere Instanz starten ?")
    If $cdeInstance = 6 Then
    ShellExecute(@ScriptDir & "\xyz.exe")
    MsgBox(64,"Neue Instanz", "Die Anwendung wurde nochmals gestartet")
    Else
    MsgBox(64,"Neue Instanz", "Die Anwendung wurde NICHT nochmals gestartet")
    Exit
    EndIf
    Else
    MsgBox(64,"Neue Instanz", "SingleStart")
    EndIf


    Danke schon einmal hier an das SUPER FORUM


    mfg
    ugt100

    Einmal editiert, zuletzt von ugt100 (4. April 2013 um 10:47)

  • Wie du schon sagst: Dieses Verhalten ist logisch, da diese Abfrage bei jedem Start passiert und du an einer Stelle versuchst das Skript neuzustarten, obwohl dies gar nicht nötig wäre.

    [autoit]

    Local $MsgBox

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

    If (_Singleton(@ScriptName, 1) = 0) Then
    $MsgBox = MsgBox(36, "Das Programm läuft bereits", "Eine Instanz der EXE läuft bereits!" & @CRLF & "Wollen Sie tatsächlich eine weitere Instanz starten ?")
    If ($MsgBox <> 6) Then
    MsgBox(64,"Neue Instanz", "Die Anwendung wurde NICHT nochmals gestartet")
    Exit
    EndIf
    MsgBox(64, "Neue Instanz", "Die Anwendung wurde nochmals gestartet")
    EndIf

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

    ; ...

    [/autoit]

    PS: Und bitte poste deinen AutoIt-Code in Zukunft so:

    Code
    [autoit]dein Skript hier[/autoit]
  • Hallo James1337,

    sorry - das mit dem Post - da habe ich zu schnell geklickert und nicht geprüft (normalerweise mache ich das schon richtig)

    So nun zu meinem Dilemma.
    Gibt es ggf. irgendeinen anderen Weg den Du Dir vorstellen kannst.
    Sinn und Zweck der Übung ist es dem lieben Userlein es zu ermöglichen eine x-te Instanz (wobei x > 1) zu starten,
    wobei allerdings eine 'Warnung' aufpoppt. Nach dessen Erscheinen soll er halt selbst ja oder nein sagen.
    Wenn NEIN - schliessen der akt. Instanz
    Wenn JA - ausführen der Instanz ohne erneute 'Prüfung/PopUp

    Danke schon mal

    mfg
    ugt100

  • Momentan hast du es ja so gelöst, dass das Skript sich selbst erneut ausführt, wenn der Benutzer eine neue Instanz starten will.
    Dadurch wird die Überprüfung allerdings erneut ausgelöst und der Benutzer kann sich wieder entscheiden, allerdings ohne eine Änderung der Situation zu erreichen.

    Das erneute Ausführen des Skripts ist allerdings gar nicht nötig, da der Code, der ausgeführt werden soll, "hinter" dieser Überprüfung steht.
    Deswegen musst du einfach nur verhindern, dass sich das Skript selbst schließt, da der besagte Code dadurch automatisch ausgeführt wird.

    Siehe auch: das Skript aus Post #2

    MfG, James

  • Hi James1337,

    da kannst Du mal sehen, ich habe vor lauter Bäumen den Wald nicht gesehen bzw. habe Deinen Kniff irgendwie total missverstanden.
    Wenn ich das jetzt richtig verstanden habe, wird sich das so machen lassen.

    Ich teste das (wahrscheinlich schon gleich morgen) und gebe DIR auf jedenfall ein Feedback.

    Supi - Danke

    mfg
    ugt100

    :thumbup:

  • Hallo James,

    wie versprochen hier mein Feedback.
    Nachdem ich Deinen Hinweis registriert und auch verstanden hatte, war das ganze ziemlich schnell gelöst.
    Im Prinzip habe ich folgendes gemacht:


    Spoiler anzeigen
    [autoit]


    ;Main (wegen Mehrfachstartabfrage)
    If (_Singleton("xyz.exe", 1) = 0) Then
    $MsgBox = MsgBox(36, "Das Programm läuft bereits", "Eine Instanz der xyz.exe läuft bereits!" & @CRLF & "Wollen Sie tatsächlich eine weitere Instanz starten ?")
    If ($MsgBox = 6) Then
    MsgBox(64, "Neue Instanz", "Die Anwendung wurde nochmals gestartet. Ein weiteres SystemTray Icon ist vorhanden")
    _cdeXYZ()
    EndIf
    EndIf
    _cdeXYZ()

    [/autoit]

    Der Kniff bestand also darin mein eigentliches Script einfach als Func zu handeln ...
    (was ich jetzt allerdings nicht weiss, ob das 'sauber' programmiert ist ?)

    Nochmals Danke - :thumbup:

    mfg
    ugt100

    P.S. man beachte den Spoiler & Co 8)