Adlib(Un)Register - Bug in Autoit?

  • Hallo Leute ,

    mir ist aufgefallen das Befehle , die unmittelbar nach einem

    [autoit]

    AdlibUnRegister

    [/autoit]

    stehen , nicht oder nicht richtig ausgeführt werden.
    Hier mal ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $Label, $iPos = 0

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

    $Form1 = GUICreate("Adlibtest", 200, 100, 990, 30)
    GUISetOnEvent(-3, "_Exit")
    $Label = GUICtrlCreateLabel("Testlabel", 25, 14, 300, 16)
    GUICtrlSetFont(-1, 11, 800, 0, "MS Sans Serif")
    $Button1 = GUICtrlCreateButton("Start",15,50,60,40)
    GUICtrlSetOnEvent(-1,"_startadlib")
    $Button2 = GUICtrlCreateButton("Stop",120,50,60,40)
    GUICtrlSetOnEvent(-1,"_stopadlib")
    GUISetState(@SW_SHOW)

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

    While Sleep(50)
    WEnd

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

    Func _startadlib()
    GUICtrlSetData($Label,"Running")
    AdlibRegister("_Laufschrift")
    EndFunc

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

    Func _stopadlib()
    AdlibUnRegister("_Laufschrift")
    GUICtrlSetData($Label,"Stopped") ; Das hier wird nicht oder zu früh ausgeführt.
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _Laufschrift()
    GUICtrlSetData($Label, StringMid("Running", $iPos) & " " & "Running")
    $iPos += 1.8
    If $iPos > StringLen("Running") Then $iPos = 0
    EndFunc

    [/autoit]

    Wenn ihr hier abwechselnd Start und Stop drückt , wird das Label früher oder später auf "Running Running Running" stehenbleiben obwohl es ja , nach dem AdlibUnRegister, auf
    "Stopped" gesetzt werden sollte.
    Ist das ein Bug oder mache/verstehe ich etwas falsch??

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

    2 Mal editiert, zuletzt von hellboy3 (4. Juni 2011 um 15:04)

  • Funktioniert bei mir fehlerfrei, egal wie oft ich zwischen start und stop wechsle.
    EDIT: ok scheinbar doch nicht, beim zweitenmal starten kann ich den Fehler nachvollziehen.

    • Offizieller Beitrag

    Hab dein Scipt getestet und bei mir zeigt es nicht das von dir beschrieben Verhalten.
    Bei Stop wird immer Stopped angezeigt.

  • Ich habe das Script , oder zumindest die Funktion mit Adlib , schon auf mehreren Rechnern ausprobiert und das Verhalten tritt definitiv auf (wenn auch nicht oft)
    Adlib muss dazu übrigens ein paar Sekunden laufen bevor man Stop drückt.

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

    • Offizieller Beitrag

    Bei 200+ Versuchen kahm 1 mal der Fehler. Weitaus öfter regiert der Start Button nicht auf einen Klick.

  • Es geht ja nicht darum wie oft ein Fehler auftritt sondern dass ein Fehler auftritt , außerdem kann man das nicht verallgemeinern , ich hatte schon Fälle , da trat der
    Fehler mehrmals hintereinander auf :huh:
    Edit: Bei misterspeed z.B. trat der Fehler schon beim 2ten Start auf.

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

    Einmal editiert, zuletzt von hellboy3 (3. Juni 2011 um 19:51)

  • ich denke die Beantwortung der Frage ist relativ simple...

    wenn Du innerhalb der "Bearbeitung" einer AdlibRegister-Funktion
    deren Status änderst, dann kann das erst nach Laufzeitende der aufgerufenen Funktion geschehen.

    Wenn in dieser Zeit dein Sleep(50) läuft, werden anscheinend die Befehle , die in dieser Zeitphase aufgerufen werden,
    ignoriert.

    - ein Sleep von (50) ist übertrieben und unnötig, da ein Sleep dein Script wirklich "pausiert". Ein Sleep von (10) ist Default und auch Standard...
    - werden Funktionen i.d.R. nicht per AdlibRegister aufgerufen. (Diese Funktion hat eigentlich nur den Sinn, Error abzufangen ...)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Leider doch noch nicht gelöst , der bug tritt selbst bei einem geringerem oder keinem sleep auf ?(

    @Com. Also doch ein Bug in AutoIt???

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

    Einmal editiert, zuletzt von hellboy3 (4. Juni 2011 um 15:42)

  • mein spontaner Workaround:
    setze vor das UnRegister einen neue Zeit für den Funktionsaufruf.
    Dann ist sichergestellt, dass sich nichts "überschneidet"
    Ist aber ungetestet ...

    [autoit]

    AdlibRegister("_Laufschrift",1000)
    AdlibUnRegister("_Laufschrift")

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • hellboy3: Wenn du meinst, dass es ein Bug ist, dann melde es. Zumindest müsste so was in die Doku aufgenommen werden.

    Falls das erneute AdlibRegister nicht funktioniert, kannst du auch eine globale Variable verwenden, die du in der adlib-Funktion prüfst und vor AdlibUnregister auf false setzt.