Probleme mit Adlibregister in Funktion

  • Hallo zusammen,

    ich habe ein seltsames Phänomen mit Adlibregister, welches ich nicht wegkriege!
    Ich definiere mit AdlibRegister einen Timer, der z.B. alle 5 Sekunden eine Funktion aufruft.

    In dieser Funktion wird dieser Timer deaktiviert weil die Funktion z.B. länger als 5 Sekunden dauert, oder weil sie die Zeit wesentlich beeinflussen würde.
    Am Ende dieser Funktion wird der Timer wieder aktiviert.

    Spoiler anzeigen
    [autoit]

    AdlibRegister("test", 5000)
    HotKeySet("{ESC}")

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

    While 1
    Sleep(5000)
    WEnd
    Exit

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

    Func test()
    AdlibUnRegister("test")
    ToolTip("Funktion")
    Sleep(4000)
    ToolTip("")
    AdlibRegister("test", 5000)
    Return 1
    EndFunc ;==>test

    [/autoit]


    Mein Problem in diesem Beispiel ist nun folgendes:
    Ich erwarte, dass nach dem verschwinden des Tooltippes (also wenn die Funktion fertig ist) die Funktion erst 5 Sekunden später wieder aufgerufen wird.
    Es dauert aber bloss 1 Sekunde.

    Was ist hier falsch?
    Gruss Veronesi

    Einmal editiert, zuletzt von veronesi (5. April 2011 um 10:26)

  • Hi

    Warum das nicht geht, kann ich leider nicht sagen, da ich AdlibRegister eigentlich nie verwende, aber du könntest Timer verwenden:

    Spoiler anzeigen
    [autoit]

    HotKeySet("{ESC}", "_Exit")

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

    $iTimer = TimerInit()

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

    While 1
    Sleep(100)
    If TimerDiff($iTimer) > 5000 Then test($iTimer)
    WEnd

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

    Func test(ByRef $iTimer)
    ToolTip("Funktion")
    Sleep(4000)
    ToolTip("")
    $iTimer = TimerInit()
    EndFunc ;==>test

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    oder auch diese Variante:

    Spoiler anzeigen
    [autoit]

    #include <Timers.au3>
    HotKeySet("{ESC}", "_Exit")

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

    $hGui = GUICreate("")
    GUISetState(@SW_HIDE)

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

    $iTimer = _Timer_SetTimer($hGui, 5000, "test")

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

    While 1
    Sleep(100)
    WEnd

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

    Func test($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    ToolTip("Funktion")
    Sleep(4000)
    ToolTip("")
    _Timer_SetTimer($hGui, 5000, "test", $iTimer)
    EndFunc ;==>test

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

    Func _Exit()
    _Timer_KillTimer($hGui, $iTimer)
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • Hallo Eukalyptus,

    vielen Dank. Ich verwende momentan auch in etwa Deine erste Variante.
    Ich dachte bloss, dass wenn ich ein umfangreiches Main habe, welches nur alle 10 Sekunden fertig wird, dass ich mit Adlibregister besser dran bin.

    Klar, Multitasking geht ja nicht, trotzdem!
    Irgendwie denke ich, dass das mit Adlibregister doch gehen MÜSSTE.

  • Ich habe das ganz mal getestet. Mir ist aufgefallen das wohl die Adlib Funktion denn letzten Start als TimeStamp speichert (nicht fundiertes Wissen).


    Mit einen kleinen Workaround gebaut mit einem Timer. So scheint es zumindest das es so wie du es dir vorstellst Funktioniert.


    [autoit]

    #include <Date.au3>

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

    AdlibRegister("test", 5000)

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

    HotKeySet("{ESC}")

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

    While 1
    Sleep(100000)
    WEnd
    Exit

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

    Func test()
    Local $iTimer
    $iTimer = TimerInit()
    AdlibUnRegister("test")
    ConsoleWrite(" > " & _Now() & " unregister" & @CRLF)
    Sleep(6000)
    ConsoleWrite(" > " & _Now() & " sleep" & @CRLF)
    AdlibRegister("test", 5000 + TimerDiff($iTimer))
    Return 1
    EndFunc ;==>test

    [/autoit]
  • Hi n2b.ch
    Danke für den Tipp. Nur dann wird ja die AdlibRegister Zeit verändert.

    Also in Deinem Beispiel ist dann die Zeit plötzlich nicht mehr 5 sekunden, sondern 11s.

  • Du könntest es so machen:

    Spoiler anzeigen
    [autoit]

    AdlibRegister("test", 1000)
    HotKeySet("{ESC}","_Exit")

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

    While 1
    Sleep(5000)
    WEnd
    Exit

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

    Func test()
    Local Static $iTimer=TimerInit()
    If TimerDiff($iTimer) < 5000 Then Return
    ToolTip("Funktion")
    Sleep(4000)
    ToolTip("")
    $iTimer=TimerInit()
    Return 1
    EndFunc ;==>test

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • Ja, das wäre tatsächlich eine Lösung.
    Allerdings frage ich mich wirklich, ob man nicht AdlibRegister zum laufen bringen könnte. Weil wenn ich den "DeRegistriere" sollte er beim nächsten registrieren doch "von 0" anfangen.

    Ist das ein Bug?

    • Offizieller Beitrag

    Scheinbar ist das ein Bug, hat mich auch schon öfter geärgert.
    Aus diesem Grund arbeite ich meist mit _Timer_SetTimer.

  • Es scheint, dass AutoIt nach dem Ausführen der Adlibfunktion noch irgendwelche Berechnungen anstellt. Lagert man die erenute Registrierung in die While-Schleife oder in ein eigenes Adlib aus, dann funktioniert es.

    Spoiler anzeigen
    [autoit]

    AdlibRegister("_test", 5000)
    While 1
    Sleep(100)
    WEnd

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

    Func _test()
    AdlibUnRegister("_test")
    ToolTip("adlib")
    Sleep(6000)
    ToolTip("")
    AdlibRegister("_RegisterAdlibTest", 0)
    EndFunc

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

    Func _RegisterAdlibTest()
    AdlibUnRegister("_RegisterAdlibTest")
    AdlibRegister("_test", 5000)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (5. April 2011 um 11:50)