Wie ändere ich beim erneuten Aktivieren des Scripts seine Funktion, während es bereits läuft

  • Hi,

    ich habe ein Script, das ein paar Funktionen ausführen soll, aber eine davon soll nicht ausgeführt werden, wenn das Skript nochmal aktiviert wird, während es bereits läuft.

    Ich hatte irgendwo gelesen, dass man es mit Singleton machen soll, aber, weil ich ein Anfänger bin und Informatik allgemein kompliziert finde, weiß ich nicht, wie ich es nutzen sollte.

    Ich möchte zur Aktivierung des Scripts und zur Aktivierung der Zusatzfunktion denselben Tastaturbutton benutzen. Bisher kriege ich es nicht hin mit meinem Wissen

    2 Mal editiert, zuletzt von eliass123 (27. Mai 2018 um 22:47)

  • Hallo,

    du hast schon ganz recht, dass Singleton das richtige Muster ist.

    Und mit genau dem Schlagwort kannst du doch beim nächsten Mal auch gerne die Hilfedatei, die auch in Deutsch erhältlich ist, durchsuchen. Diese ist sehr nützlich und enthält zudem Codebeispiele.

    Hier ein nur minimal angepasstes Codebeispiel, das der Hilfedatei entnommen wurde:

    AutoIt
    #include <Misc.au3>
    #include <MsgBoxConstants.au3>
    
    If _Singleton("test", 1) = 0 Then
        ; Hier muss der Code rein, wenn es vorher bereits aufgerufen wurde und die erste Instanz noch läuft
        MsgBox($MB_SYSTEMMODAL, "Warning", "An occurrence of test is already running")
    Else
        ;Hier muss der Code des ersten Programmstarts rein
        MsgBox($MB_SYSTEMMODAL, "OK", "the first occurrence of test is running")
    EndIf

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Hallo,

    du hast schon ganz recht, dass Singleton das richtige Muster ist.

    Und mit genau dem Schlagwort kannst du doch beim nächsten Mal auch gerne die Hilfedatei, die auch in Deutsch erhältlich ist, durchsuchen. Diese ist sehr nützlich und enthält zudem Codebeispiele.

    Hier ein nur minimal angepasstes Codebeispiel, das der Hilfedatei entnommen wurde:

    AutoIt
    #include <Misc.au3>
    #include <MsgBoxConstants.au3>
    
    If _Singleton("test", 1) = 0 Then
        ; Hier muss der Code rein, wenn es vorher bereits aufgerufen wurde und die erste Instanz noch läuft
        MsgBox($MB_SYSTEMMODAL, "Warning", "An occurrence of test is already running")
    Else
        ;Hier muss der Code des ersten Programmstarts rein
        MsgBox($MB_SYSTEMMODAL, "OK", "the first occurrence of test is running")
    EndIf

    Habe es hingekriegt, singleton zu integrieren aber...

    ich starte das script 2 mal und beide versionen laufen. Sie führen alle Operationen richtig aus, bis auf die tatsache, dass die zuerst ausgeführte version des scripts sich nicht von selbst schließt, obwohl es bei AdlibRegister("_StopRecord", 1000*60*1) einen Exit aktivieren müsste. Als ich davor ohne Singleton gescriptet hatte, funktionierte es auch richtig und wenn ich nur eine version des scripts zur selben zeit aktiv habe, schließt es sich auch korrekt. (datei im anhang)

    Außerdem kommt manchmal willkürlich die Operation

    Code
    ControlSend ( "OBS 21.1.0 (64bit, windows) - Profil: Unbenannt - Szenen: Unbenannt", "", "[CLASS:Qt5QWindowIcon; INSTANCE:1]", "+{f11}" )

    nicht in meinem programm an. Brauche ich vielleicht sowas wie größere Pausezeiten zwischen den Aktionen? (Muss ich dazu bei

    Code
    While 1    Sleep(20)
    WEnd

    die Sleepzeit erhöhen? (hatte mir wer anders vorgeschrieben, deswegen bin ich mir unsicher)

    Das ist die Version ohne Singleton, die korrekt Exit getriggert hat:

  • Hmm singelton - da muss ich passen - warum schreibst Du nicht einen Wert in die Reg und prüfst einfach ab ob er da ist oder nicht?

    Script staten -- kein Wert - Script setzt Wert. Nächste Instanz Wert da Funktion nicht ausführen - Wert löschen usw.....

    Wenn Du mehrere Versionen des Scriptes starten willst mußt Du sie auseinanderhalten. z.B. andere Namen - oder via Zufalszahl usw.

    Ja mir ist auch klar das ganze hate einen Schönheitsfehler kein Script darf abstürzen sonst kommt man aus dem Tritt. Man kan aber zur Sicherheit auch noch ein Datum/Uhrzeit mit wegschreiben -> das hilft. Mache ich schon seit Jahren so und funktioniert eigentlich reibungslos.

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hier mal eine kleine Demo aus meinem Code-Schnipsel-Archiv...

  • Hier mal eine kleine Demo aus meinem Code-Schnipsel-Archiv...

    danke, das war sehr hilfreich. konnte mein script problemlos darin integrieren und hab das fenster versteckt mit

    Code
     GUISetState(@SW_HIDE)
  • Hier mal eine kleine Demo aus meinem Code-Schnipsel-Archiv...

    Derzeit nutze ich diese Version des scripts

    Das Problem gerade ist, dass, wenn ich das Script das 3. mal starte, während es bereits lief, nach der 1 minütigen Laufzeit eine Version des Scripts für immer bestehen bleiben wird und sich nicht schließt. https://i.imgur.com/1Eduya2.png

    Das bedeutet, sobald ich das Script wieder so nutzen wollte, denkt das neue script es wäre die 2. und nicht die 1. Instanz.

    In deinem Original Script war es nicht so und ich habe auch schon versucht, die Scripts anzugleichen oder die "Sleep(150)"s durch Adlibregister(funktion exit, 150) zu ersetzen

    findest du den fehler im code, warum sich das script bei der 3. ausführung nicht schließt?

  • Hier mal eine minimalistische Version... den Rest bekommst du wohl selbst hin...