_Singleton & Windows 8 funktioniert nicht?

  • Hallo liebe Community,

    ich habe das Problem, das bei allen meinen Scrips ob compiliert oder nicht, die _Singleton Funktion nicht funktioniert.
    Die gleichen Programme/Scripte funktionieren sowohl mit Windows 7 als auch Windows XP.

    Habt Ihr von solchen Problemen schon gehört oder habt Ihr eine Idee was man testen kann?


    Folgende Möglichkeiten habe ich in meinen Scripts eingebaut.

    [autoit]

    #include <Misc.au3>
    If _Singleton(@ScriptName, 1) = 0 Then
    MsgBox(0, "Warning", "An occurence of test is already running")
    Exit
    EndIf
    MsgBox(0, "OK", "the first occurence of test is running")

    [/autoit][autoit]

    _Singleton

    [/autoit]


    Vielen Dank schon jetzt für Eure Hilfe


    Mit besten Grüßen
    dabronko1

  • Das Makro @ScriptName enthält neben dem Skriptnamen auch die Dateiendung.
    Da der Befehl _Singleton aber nur den Dateinamen überprüft, muß die Endung noch entfernt werden:
    *Erklärung, siehe nächsten Beitrag von misterspeed...

    Spoiler anzeigen
    [autoit]

    ;==> im Nornalfall besteht die Endung aus 3 Zeichen Plus Punkt (.exe). Es genügt also, die letzten 4 Zeichen abzuschneiden
    $$singleton = StringTrimRight(@ScriptName, 4)
    ;==<

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

    ;==> für beliebige Dateiendungen (was eigendlich nicht vorkommen sollte) kann man folgenden RegEx Pattern benutzen
    $singleton = StringRegExpReplace(@ScriptName, "\.[a-zA-Z1-9]{1,}$","")
    ;==< KEINE Garantie auf 100%tige Trefferquote ;)

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

    ;==> die Variable $singleton dann einfach in die If/Then Abfrage einbinden

    [/autoit]
  • Das Makro @ScriptName enthält neben dem Skriptnamen auch die Dateiendung.
    Da der Befehl _Singleton aber nur den Dateinamen überprüft, muß die Endung noch entfernt werden;

    Öhm nein. Es ist richtig, dass @Scriptname auch die Dateiendung enthält, singleton prüft jedoch weder den Dateinamen, noch die Dateiendung, sondern immer den kompletten String, der für das Singleton Mutex angegeben wurde. Es ist völlig egal welcher String hier angegeben wird, sei es "abc" oder der Name des Scriptes, er sollte aber nach Möglichkeit eindeutig sein, damit es nicht zu Komplikationen mit anderen Programmen kommt. Sobald ein zweites Programm genau den selben String nutzen möchte um ein Mutex zu erzeugen kommt es zum Fehler, dadurch weiß die Funktion Singleton, dass es bereits eine Instanz gibt.

    Deine Kritik ist hier also nur in sofern angebracht, als dass der hier verwendete String @scriptname nicht den Start einer kompilierten + unkompilierten Fassung des Scripts erkennen kann, da jeweils unterschiedliche Strings für das Mutex verwendet werden. Wird allerdings jeweils die selbe Scriptfassung, also beide male die unkompilierte oder beide male die kompilierte Fassung gestartet funktioniert die Prüfung sehr wohl so wie sie derzeit ist.

    Bei mir funktioniert das ganze im übrigen sowohl unter Windows 7 als auch in meiner Windows 8 VM (allerdings noch eine alte Evaluation Beta). Ich kann also kein Problem, das Win 8 spezifisch wäre erkennen. Bei deinem Testscript fehlt allerdings eine Schleife, die die erste Instanz am Leben erhält, aber ich gehe davon aus, dass du das nur vergessen hast hier zu posten, bzw. solange man die msgbox nicht schließt läuft die Instanz ja noch und das Mutex funktioniert auch wie es soll.

    Die einzige Fehlerquelle die ich noch erkennen kann wäre, dass das Mutex ebenfalls nicht funktionieren dürfte, wenn die Instanzen auf verschiedenen Benutzeraccounts gestartet werden, da hier wie in der Hilfe zu singleton beschrieben noch ein "Global\" vor den String platziert werden müsste, andernfalls können andere Benutzer nicht auf das Mutex zugreifen.

  • Danke für die ausführliche Erklärung!
    So kurz und knapp, wie's in der Hilfe steht, hab ich die Erklärung dort nie so richtig verstanden.
    Da ich neulich ein ähnliches Problem hatte und mein Programm nach dem Entfernen der Dateiendung funktionierte, hab ich mir den Rest "zusammengereimt" ;)
    Sorry für die Fehlinfo... ?(

    Sollte ich meine falsche Antwort oben löschen, bzw. ändern oder alles so lassen ,wie es ist, um den Threat nicht zu verfälschen?

  • Ich würde es so lassen, oder durchstreichen und dazu schreiben dass es falsch ist

    Um Missverständnisse zu vermeiden, mein Name rührt vom Sternenbild und nicht vom Shop her :D


    Rainbow Dash :rock:

    "Das, wobei unsere Berechnungen versagen, nennen wir Zufall." (Albert Einstein)