Adlibregister() vs. Timer

  • Hey, ich möchte gerne Adlibregister besser verstehen, um einschätzen zu können, wo sich eher ein Timer und eher ein Adlibregister anbietet. :)

    Meine Suche hat mich da bisher nicht so weitergebracht, sind eher sehr praktische Fragen, außer z. B. https://www.autoitscript.com/forum/topic/19…ister-vs-timer/

    Ich wüsste gerne, wie Adlibregister sich verhält und wie dominant es ist - vor allem bei mehreren Adlibregister'n.

    Aus der Hilfe wird ja klar, dass Adlibregister sich Vorrang verschafft und solange das Hauptscript pausiert. Wie ist das, wenn man mehrere registriert und die zufällig "durcheinander geraten"?

    Habe z. B. 2 Adlibs, eine, die alle 5 Sekunden was ausführt und eine, die alle 60 Sekunden was ausführt und beide Funktionen brauchen auch mal 5 Sekunden oder so. In dem Beispiel würden die beiden regelmäßig gleichzeitig laufen wollen.

    Ich gehe mal davon aus, dass das in AutoIt nicht so einfach parallel passiert.

    Wie verhalten sich die Funktionen nun? Wird die, die zuerst gestartet ist, sich dominant verhalten und nicht stören lassen? Wenn ja, gibt es dann einen "Adlib-Pool" und die andere legt danach sofort los?

    Oder gilt für Adlibregister in Sachen Dominanz nur das Starten der Funktion und danach gilt es als "Hauptskript" und wird von folgenden Adlibregister'n unterbrochen? Wenn ja, macht das 1. Adlibregister dann danach weiter, wo es unterbrochen wurde?

  • Hey, danke. Also damit ich das richtig verstanden habe: Wenn ein Adlib ausgeführt wird, unregistrierst du alle anderen Adlibs und setzt die dann wieder in einen Intervall, in denen die einige Zeit nicht stören sollten?

    Ist da implizit auch die Antwort mit drin: "Ja, eine zweite Adlib überschreibt die Aktion der ersten Adlib."?


    Spannend wäre auch, wie sich Variablen verhalten, wenn die gleiche Funktion mit Adlib aufgerufen wird, nur mit einem anderen Parameter durch eine Hilfsfunktion.
    Also z. B. ich habe "AdlibA" und "AdlibB", die ich registriere und AdlibA ruft "FUNC" mit dem Parameter "a" auf und AdlibB ruft "FUNC" mit dem Parameter "b" auf. Werden dann die Variablen überschrieben oder ist das dann eine eigene Instanz?


    Ich habe das mal so probiert nachzuvollziehen:

    Output ist:

    Daraus schließe ich, dass die Adlibs sich nicht gegenseitig stören und in einen "Pool" gegeben werden, der nacheinander abgearbeitet wird. Das ist schon mal super :) Ich verstehe nur nicht, warum nun immer A>B>A>B kommt. Ohne den Sleep() gab es immer A>A>B>A>A>B

    Daraus schließe ich, dass das Setzen der Adlibs zwar eine Dominanz nach Reihenfolge der Registrierung setzt, jedoch jedes Adlib nur einmal in diesem Pool sein darf.

    Ist das Skript dazu geeignet, solche Schlussfolgerungen zu ziehen?

    2 Mal editiert, zuletzt von aSeCa (30. Dezember 2018 um 15:38)

    • Offizieller Beitrag

    AdlibRegister ist blockierend!

    Die Funktion, die dort aufgerufen wird, blockiert das Hauptscript und alle weiteren Adlib-Funktionen.

    Mal als Beispiel:

    "_Adlib2()" wird erstmal alle 500 ms aufgerufen, bis das erste Mal "_Adlib1()" aufgerufen wird. Die Funktion braucht 5 Sekunden und wird nicht unterbrochen. Wenn die 5 Sekunden um sind, kommt einmal "_Adlib2()" dran und dann gleich wieder "_Adlib1()".

    Deswegen sollte die aufgerufene Funktion nie länger dauern, als bis zum nächsten Aufruf.

  • AdlibRegister ist blockierend!

    Die Funktion, die dort aufgerufen wird, blockiert das Hauptscript und alle weiteren Adlib-Funktionen.

    "_Adlib2()" wird erstmal alle 500 ms aufgerufen, bis das erste Mal "_Adlib1()" aufgerufen wird. Die Funktion braucht 5 Sekunden und wird nicht unterbrochen. Wenn die 5 Sekunden um sind, kommt einmal "_Adlib2()" dran und dann gleich wieder "_Adlib1()".

    Deswegen sollte die aufgerufene Funktion nie länger dauern, als bis zum nächsten Aufruf.

    Hey, das würde meine Vermutung ja bestätigen und ist ja sehr sinnvoll :). Mit dem Wissen kann ich das hoffentlich effektiver einsetzen, vielen Dank!

    • Offizieller Beitrag

    Ich denke mal, der interne Ablauf dürfte in etwa so aussehen:

    Edit: Eine kleine Korrektur. Es war die TimerDifferenz plus die Aufrufmillis für den neuen Aufruf. So entspricht es aber dem originalen AdlibRegister.