Singleton - ist es möglich den bereits laufenden, also den ERSTEN Prozess zu beenden

  • Hallo zusammen!

    Ich hab hier im Forum schon sehr viel gestöbert, und auch bisher alles gefunden was ich gesucht habe, bis auf jetzt... :S
    Ich hoffe Ihr könnt mir helfen!

    Kurz zur Erklärung:
    Ich schreibe eine Anwendung die eine gewisse Zeit hochzählt, bis dann nach ca. einer Stunde z.B ein Alarm ausgelöst wird.
    Aufgerufen wird diese Anwendung wenn eine Mail eingeht.
    Jetzt soll allerdings wenn noch kein Alarm ausgelöst wurde und zwischenzeitlich aber eine neue Mail eingeht (die dann die Anwendung erneut aufruft)
    davon die erste Instanz beendet werden, damit die neue Instanz der Anwendung die Zeit wieder von vorne zählen kann bis dann wieder nach einer Stunde
    Alarm ausgelöst würde, ginge keine neu Mail ein.

    Mit der Funktion Sigleton kann man allerdings (soweit ich das gefunden habe) die zweite startende Instanz killen...

    Könnt Ihr mir da weiterhelfen? 8o

    Liebe Grüße!

  • 3 Möglichkeiten:
    1. Statt SingleTon einfach den ersten Prozess killen (ProcessExists, Close etc.)
    2. SingleTon behalten, aber einen Kommunikationsweg zwischen Prozessen benutzen und dem ersten Prozess sagen, dass er von vorne anfängt.
    3. Statt bei eingehender Email ein neues Programm starten, einfach dem aktuellen Wecker sagen, dass er neustarten soll.

    Das erste ist das einfachste, die anderen beiden verbrauchen nicht so viel unnötige Leistung, sind aber schwerer ^^
    Wähle weise :P

    PS:
    wie ich gerade gesehen hab, kannst du mit SingleTon auch ohne Exit überprüfen, ob eine Instanz vorhanden ist. Dann brauchst du evtl. nurnoch ProcessClose

  • Ich würde auch versuchen, das in einer Anwendung abzuwickeln.
    Welches Mailsystem verwendest Du? Outlook ...?

  • Da Singleton nicht angibt wieviele Prozesse es sind, habe ich vor einiger ZEit mal folgendes in einem Skript eingebaut:

    [autoit]

    $_Singleton = ProcessList(@ScriptName)
    If $_Singleton[0][0] > 3 Then MsgBox(48, $vTitle, "Using more than 3 .... may cause performance leaks and system instability", 10)

    [/autoit]

    Evtl kann man das ja so umbauen:

    [autoit]

    $_Singleton = ProcessList(@ScriptName)
    If $_Singleton[0][0] > 1 Then
    For $i = 1 to $_Singleton[0][0]
    If $_Singleton[$i][1] <> @AutoItPID Then ProcessClose($_SINGLETON[$i][1])
    Next
    EndIf

    [/autoit]


    (ungetestet)

    [autoit]

    If ProcessExists("Sig.exe") Then
    ConsoleWrite("@@ mfg")
    Else
    ConsoleWrite("!! -no sig-")
    EndIf

    [/autoit]
  • Hallo zusammen! :rock:

    Ich würde auch versuchen, das in einer Anwendung abzuwickeln.
    Welches Mailsystem verwendest Du? Outlook ...?

    Jap, ich verwende Outlook, das läuft bei uns auf nem Multipoint Server, und ist somit permanent aktiv,
    und man kann da ja prima in einer Regel sagen, wenn "irgendeine"-Mail eingeht, starte die Anwendung xy.
    Ich wüsste nicht wie ich das anders lösen kann..

    $_Singleton = ProcessList(@ScriptName)
    If $_Singleton[0][0] > 1 Then
    For $i = 1 to $_Singleton[0][0]
    If $_Singleton[$i][1] <> @AutoItPID Then ProcessClose($_SINGLETON[$i][1])
    Next
    EndIf

    Das sieht doch schonmal gut aus, sowas in der Richtung mit PIDs hatte ich auch schon versucht..
    im Grunde genommen müsste man bei meinen Prozessen die PIDs auslesen und alle beenden außer den neuesten,
    nur genau das war mein Problem.. ?(

  • Die von mir gepostete Schleife beendet alle Prozesse mit dem Namen deines Prozesses außer dem eigenen, also wenn ich das richtig verstanden habe genau das, was du suchst.

    [autoit]

    If ProcessExists("Sig.exe") Then
    ConsoleWrite("@@ mfg")
    Else
    ConsoleWrite("!! -no sig-")
    EndIf

    [/autoit]
  • Die von mir gepostete Schleife beendet alle Prozesse mit dem Namen deines Prozesses außer dem eigenen, also wenn ich das richtig verstanden habe genau das, was du suchst.

    Das wäre sogar genau das was ich suche... nur irgendwie steig ich nicht so ganz durch! Meinst du das so?
    Wenn ich die Abfrage am Anfang des Skriptes mach, wird dieses sofort wieder beendet, da es wieder alle Prozesse process.exe beendet. :(

    If ProcessExists("process.exe") Then
    ProcessClose("process.exe")
    Else
    ConsoleWrite("!! -no sig-")
    EndIf

  • zwischenzeitlich aber eine neue Mail eingeht (die dann die Anwendung erneut aufruft)
    davon die erste Instanz beendet werden, damit die neue Instanz der Anwendung die Zeit wieder von vorne zählen kann

    Hört sich für mich an, als ob es einfacher sei einfach 1 Programm zu schreiben. Ich meine du hast dann einen Timer den du jedes mal wenn eine neue Nachricht eingeht einfach resetest :)

    #Edit: Beispiel: Sofern du das Skript schmal hälst und das Speichermanagement während einer Testphase beobachtest, einfach das AutoIt Skript immer laufen lassen und in bestimmten Zeitintervallen auf neue Mails prüfen. Somit ist was ich oben geschrieben habe gleich mit abgedeckt, da nix gestartet/gestoppt werden muss.

    Grüße Yaerox

    Grüne Hölle