AdlibRegister

  • Ich möchte gerne eine Funktion erzeugen die parallel abgearbeitet werden sollte. Hintergrund ist eine SSH abfrage, die einen Zustand überwachen sollte. Ich verstehen aber die AdlibRegister Funktion nicht, warum wird in meinem einfachen Beispiel das Datum nicht übergeben? Eine Eventgesteuerte Reaktion einer Unterfunktion, ohne auf diese zu Warten, geht das überhaupt?

    [autoit]


    dim $datum
    AdlibRegister("MyAdlib")
    MsgBox(0,"Heute ist der " ,$datum)
    Exit

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

    Func MyAdlib()
    $datum = (@MDAY & "." & @MON & "." & @YEAR)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]
  • Liegt daran, dass "MyAdlib" erst nach 250 ms aufgerufen wird - Standard bei Adlibregister - du aber vorher schon die Variable abfragst, bevor sie überhaupt einen Wert bekommt. Mit einem Sleep dazwischen bekomme ich ein Datum ausgegeben. =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Danke, es hilft oft mal mehr drüber nachzudenken und sei es auch nur 250 ms. Ist nun eine reale Eventsteuerung möglich?

  • Nun ja, "reale Eventsteuerung" ist so hoch gegriffen ^^

    Zitat

    The adlib function should be kept simple as it is executed often and during this time the main script is paused.

    Funktioniert also nicht, ohne auf die Funktion zu warten. Das wär ja quasi Multithreading ;)
    Und bevor wieder irgendwelche Streitereien losbrennen - AutoIt ist nicht threadsicher, trotzdem gibt es da irgendwelche Workarounds... naja.

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    • Offizieller Beitrag

    Mit der Timer-UDF kannst Du das so lösen:

    Spoiler anzeigen
    [autoit]


    #include <Timers.au3>
    Dim $datum = @MDAY & "." & @MON & "." & @YEAR & @CR & @HOUR & ":" & @MIN & ":" & @SEC
    $hGUI = GUICreate("Dummy")
    _Timer_SetTimer($hGUI, 250, "_UpdateClock")
    MsgBox(0, "Heute ist der ", $datum)
    _Timer_KillAllTimers($hGUI)
    Exit

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

    Func _UpdateClock($hWnd, $Msg, $iIDTimer, $dwTime)
    Local $datum = @MDAY & "." & @MON & "." & @YEAR & @CR & @HOUR & ":" & @MIN & ":" & @SEC
    ControlSetText("Heute ist der ", "", "[CLASS:Static; INSTANCE:1]", $datum, 1)
    EndFunc ;==>MyAdlib

    [/autoit]
  • Mit einer GUI statt einer Messagebox geht esw auch mit adlib.

    Spoiler anzeigen
    [autoit]

    #include <Timers.au3>
    Dim $datum = @MDAY & "." & @MON & "." & @YEAR & @CR & @HOUR & ":" & @MIN & ":" & @SEC
    $hGUI = GUICreate("Heute ist der", 200, 80)
    $lblClock = GUICtrlCreateLabel("", 10, 10, 180, 30)
    $btnOK = GUICtrlCreateButton("OK", 60, 40, 80, 30)
    _UpdateClock()
    AdlibRegister("_UpdateClock", 500)
    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case -3, $btnOK
    ExitLoop
    EndSwitch
    WEnd
    AdlibUnRegister("_UpdateClock")
    Exit

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

    Func _UpdateClock()
    Local $datum = @MDAY & "." & @MON & "." & @YEAR & @CR & @HOUR & ":" & @MIN & ":" & @SEC
    GUICtrlSetData($lblClock, $datum)
    EndFunc ;==>MyAdlib

    [/autoit]

    Dein Fall mit SSH ist aber wohl nicht so einfach zu "reparieren" ;)