Bereits laufende Instanz eines Scripts/einer Exe identifizieren

  • Hallo Forum ;)

    leider bin ich einer dieser gefürchteten AutoIt-Anfänger. Nach dem Motto "Learning-by-Doing-Boing" bin ich erst seit kurzem dabei, mir eine AutoIt-Exe zurecht zu basteln - als Grundlage hierfür dienen mir Snipplets bereits geschriebener und veröffentlichter Scripte. Dann schau' ich, was so ein Script macht, und lese dann die Referenz des Kommandos.

    Zu meinem Problem: Mein Script bietet - als einzige Möglichkeit, auf die jeweiligen Funktionen zuzugreifen - ein TrayIcon an. Soweit läuft alles auch unproblematisch - ich will das zur exe kompilierte Script jedoch durch andere Programme starten lassen.

    Diesen Programmen kann ich nun nicht sagen: "Wenn die Exe läuft, dann starte keine weitere Instanz, sondern führe die und die Funktion der bereits laufenden Instanz der exe aus". Oder noch besser "Wenn keine weitere Instanz dieser exe aktiv ist, führe diese Funktion XYZ aus".

    Das heißt, ich benötige eine Routine, die prüft, ob bereits eine Instanz der exe "xyz.exe" läuft, und die im folgenden so funktioniert, dass keine weitere Instanz gestartet wird.

    Hätte ich ein geöffnetes Fenster zur Verfügung, könnte ich ja mit dem Info-Tool arbeiten (ich weiß, ist die lahmste Methode) - damit kann ich jedoch nicht das Script / die exe im System-Tray identifizieren lassen.

    Welche Methoden gibt es da?

    Viele Grüße und danke bereits für die Antworten

    Einmal editiert, zuletzt von Argonaut (27. September 2007 um 13:28)

    • Offizieller Beitrag

    Hi!

    Mit ProcessExists kannst du schauen, ob ein bestimmter Prozess läuft (Prozessname in aller Regel gleich dem Namen der Exe-Datei).
    Von AutoIt-Seite verhinderst du mehrere Instanzen mit dem Befehl _Singleton :).

    peethebee

    p.s. Vorbildlicher Post, da kann man was mit anfangen - so machen es leider viel zu wenige...

  • @ peethebee 'n Xenobiologist,

    *wow* - Dankt nicht mir für meinen Post! und:

    *wow* - Danke für die wirklich außergewöhnlich flotte Hilfe! Jetzt müsst Ihr damit leben, dass ich wahrscheinlich gerne bei Problemen immer mal wieder nachfrage *grinsel*

    Das Script werd' ich gerne später posten.

    Viele Grüße

    Einmal editiert, zuletzt von Argonaut (27. September 2007 um 13:55)

    • Offizieller Beitrag

    Hi!

    Wir sagen auch, wenn ein Post nutzlos ist, da wollte ich zeigen, dass ich auch merke, wenn er gut ist ;). Vielleicht nimmt sich ja der ein oder andere ein Beispiel daran (zu hoffen wäre es).

    Weiter so, und darfst gerne wiederkommen ;).

    peethebee

  • Na ja, da wäre ich bereits wieder - ich hoffe mit einer lösbaren Problematik...

    Ich habe mich für die Methode _Singleton("xyz") entschieden (Ursprüngliches Problem s. o.).

    Teil dieses Problemes war jedoch auch (ich entschuldige mich, dass ich vergaß, das zu erwähnen), dass die Programme, die das Script bzw. die kompilierte exe aufrufen, Parameter übergeben.

    Diese Parameter habe ich bereits mit $CmdLine definiert, und einleitend gescriptet

    Code
    If $CmdLine[0] > 0 Then
    	If $CmdLine[1] = StringUpper("-parameter1") Then function1()
    	If $CmdLine[1] = StringUpper("-parameter2") Then function2()
    EndIf

    Mit _Singleton habe ich jetzt das Problem, dass - völlig egal, ob es am Anfang des Scripts steht oder in einer Schleife - nur die eine Instanz gestartet bleibt. Wird die exe noch einmal mit einem anderen Parameter aufgerufen, so wird die Aktion, die aufgrund des Parameters ausgelöst werden soll, nicht ausgelöst.

    Diese eine Instanz will ich jedoch, abhängig vom übergebenen Parameter, dazu bringen, eine jeweils zugewiesene Funktion zu "erledigen" - ohne dass hierzu eine weitere Instanz gestartet wird.

    Ich weiss, das ist "nur" ein logisches Problem - aber scheinbar hab' ich da mehr als nur ein Brett vor'm Schädel. Gibt's da also irgend eine Art von Workaround, den ich bei der Suche übersehen habe?

    Danke nochmal und viele Grüße

  • Hallo @ Xenobiologist,

    neee, da hab' ich mich wahrscheinlich umständlich, falsch, unverständlich oders sonstwie ausgedrückt. Sorry dafür.

    Folgendes Modell liegt meinem (wahrscheinlich beschädigten) Gedankengang zu Grunde:

    Ich habe die AutoIt-EXE Aah.exe

    Diese soll zwei Zustände kennen:

    a) bereits gestartet
    b) noch nicht gestartet

    Der Start dieser Exe soll entweder manuell oder aus einem anderen Nicht-AutoIT-Programm heraus (Ich nenne es einmal Beeh.exe) erfolgen.

    Beeh.exe ist ständig aktiv.

    Jetzt tritt der Fall ein, dass Aaah.exe nicht aktiv ist, und Beeh.exe die Aaah.exe aufgrund eines Ereignisses starten soll.

    Aaah.exe soll sich jedoch nach dem Start nicht beenden, sondern nach dem ersten Start im Systray festsetzen. Aaah.exe soll nämlich als Info-Tool dienen, wenn ein Ereignis durch Beeh.exe festgestellt wurde. Aaah.exe speichert also die durch das Ereignis (Beeh.exe) weiterverarbeiteten Informationen, und bleibt bis zum Shutdown oder dem manuellen Beendigen im Systray stehen.

    Nun wiederholt sich das Ereignis (Beeh.exe) erneut - Beeh.exe startet also nochmal Aaah.exe. Aaah.exe soll dann die weiteren Informationen des Beeh.exe Ereignisses den gespeicherten Infos hinzufügen, und dann weiter im Systray schlummern.

    Ohne _Singleton steht Aaah.exe an diesem Punkt zweimal im SysTray, einmal mit einer Info, und einmal mit der zweiten Info.

    Das war (s. o.) so von mir nicht gewollt. Vielmehr sollte die zweite (+1 bei jedem Beeh.exe-Ereignis) Info in der bestehenden Instanz angezeigt werden.

    Mit _Singleton bleibt die gestartete Aaah.exe bei jedem Aufruf durch Beeh.exe zwar die einzige Instanz - die Daten, die jedoch auf Kommando von Beeh.exe verarbeitet werden sollen, werden von dieser Instanz nicht verarbeitet - d. h. die 2., 3., 4. Info wird der Instanz von Aaah.exe nicht hinzugefügt.

    Beeh.exe soll Aaah.exe aufgrund unterschiedlicher Parameter, die Beeh.exe jeweils an Aaah.exe übergibt, unterschiedliche Funktionen abarbeiten lassen, die zur Anzeige unterschiedlicher Informationen in ein und der selbern Instanz führen.

    Meine Frage ist:

    Wie bekomme ich nun trotz _Singleton meine Instanz von Aaah.exe dazu, bei einem nochmaligen Aufrufen durch Beeh.exe nur die Funktion abzuarbeiten, die durch Parameterübergabe initiiert werden soll - aber ansonsten als einzige Instanz von Aah.exe im Tray zu verbleiben, und sich selbst zu aktualisieren.

    Ist wahrscheinlich echt leicht und logisch - aber ich bin in dieser Hinsicht im Moment echt indisponiert, weil ich als AutoIt-Neuling wahrscheinlich den Wald vor lauter Bäumen nicht sehe...

    Jeder Lösungsvorschlag, vielleicht als Theorie-Snipplet (weil ich mich daran sehr gut orientieren kann, siehe auch Euer saugutes Wiki), wäre mir willkommen.

    CU und Danke im Voraus

    • Offizieller Beitrag

    Hallo!

    Vielleicht eine C.exe zwischenschalten, die nur die Ereignisse von A.exe in eine Textdatei schreibt und sich dann beendet (kein Singleton nötig). Die B.exe müsste sich dann periodisch die Datei anschauen und die Meldungen oder was auch immer daraus anzeigen.
    Vielleicht reicht es auch schon, wenn du dein Singleton in der Skriptdatei weiter nach hinten verschiebst. Alles davor sollte in jedem Fall ausgeführt werden.

    peethebee

  • Hi @ peethebee 'n Xenobiologist,

    das Programm B, das für die AutoIt-Aaah.exe die Infos bereitstellt, kann bei einem entsprechenden Ereignis nur ein executable starten. Diesem Executable werden - je nach Ereignis - verschiedene Parameter automatisch übergeben.

    Für mich ist die einzige Möglichkeit, diese Parameter geeignet weiterzuverarbeiten, meine AutoIt-Aaah.exe.

    Das B-Proggi kann aber jeweils immer nur diese eine A-executable starten.

    Sicher, ich kann im dummen B-Programm eine C-executable einstellen, die prüft,

    a) gibt's ne A-Instanz
    b) wenn ja, dann starte keine neue und
    c) aktualisiere A um weitere Datensätze oder
    d) wenn nein, dann starte eine A-Instanz und
    e) aktualisiere diese direkt mit dem neuen Datensatz

    Ich suche aber nach einer Möglichkeit, die aus einem neuen erneuten Aufruf der A.exe heraus diese Prüfung beinhaltet, also

    a) A selbst überprüft, ob eine A-Instanz bereits gestartet ist,
    b) wenn ja, beendet sich jede weitere außer der ersten A-Instanz und
    c) die erste A-Instanz verarbeitet in Ruhe die Daten.

    Dass bedeutet, mein Problem ist, durch einen erneuten Aufruf der A.exe eine bereits bestehende Instanz der A.exe zum Verarbeiten der unterschiedlichen Ereignisse zu bekommen.

    D. h. ich brauche die Möglichkeit, die A.exe durch nochmaliges Aufrufen auf eine bestehende Instanz zu verweisen.

    Und das Dumme : Ich weiss nicht, wie ich das Anstellen kann, ohne tatsächlich noch einmal eine Instanz von A zu starten. Es soll faktisch nur einmal A im Systray stehen.

    Vergebt mir! Doch ihr seid besser in so etwas...

  • Ich habe es hinbekommen (Fassen kann ich's nicht, aber es stimmt) -

    am Ende jeder Funktion, die durch einen der übergeben CmdLine-Parameter ausgeführt werden sollte, steht jetzt bei mir "_Singleton" - d. h. A startet nochmal, arbeitet ab, aktualisiert die bestehende Instanz, prüft auf diese Instanz, und schaltet sich ab.

    Dank an peethebee!

  • Du hast es gelöst, aber vielleicht dennoch hier eine Lösung wie ich mal ein ähnliches (gleiches?) Problem in den Griff bekommen habe:

    Programm A (DOS-Programm) startet Autoit-B-Programm mit Übergabeparametern.

    AutoIt-B-Programm erhält somit die Daten per CMDLINE-Befehl.

    AutoIt-C-Programm ist mein Verarbeitungsprogramm welches immer aktiv ist.
    Dieses erhält die Daten von AutoIt-B-Programm per TCP-Befehle. AutoIt-B-Programm wird nach Übergabe wieder beendet.

    Viele Grüße
    Carsten

  • Hallo Carsten,

    danke für Deine zusätzliche Erläuterung. Diese Möglichkeit hätte ich als nächstes in Betracht gezogen (ziehen müssen).

    Als absoluter AutoIt-Newbie orientiere ich mich überwiegend an Code-Snipplets. D. h. ich schaue mir ein Script in der Ausführung an, gucke dann in die Source, und schlage dann nach, welches Kommando was wie macht (und ansonsten machen könnte). So lerne ich "by doing".

    Das macht es für mich einfacher, als "für erfahrene Programmierer" gängige und gebräuchliche Ausdrücke zuerst nachvollziehen, und dann erst mit einer bestimmten Funktion in Verbindung bringen zu müssen. :comp2: :]

    Hättest Du vielleicht eine Referenz für mich, wo ich nachschauen könnte, wie Du das Problem damals gelöst hast (z. B. als Snipplet)?

    Viele Grüße

    Einmal editiert, zuletzt von Argonaut (28. September 2007 um 09:30)