RegisterWaitForSingleObject zum abfangen von Events mit Callback Funktionen

    • Offizieller Beitrag

    Hallo,

    Ich war auf der Suche nach einer Möglichkeit die Funktion WaitForSingleObject als ein OnEvent zu benutzten, also nicht darauf warten zu müssen bis die Funktion fertig ist (das Event wahr ist) um während darauf zu warten noch andere Dinge im Script zu machen. Die Windows API hat dafür die Funktion RegisterWaitForSingleObject; da es dafür aber noch keine AutoIt Implementierung gab, hab ich das in die Hand genommen.

    Die einzige Restriktion: Es kann immer nur ein Event zur Zeit abgefangen werden. Um das zu umgehen, könnte man mit einem statischen Array arbeiten, da dies aber meistens nicht gebraucht wird und nicht ganz sauber ist, habe ich es so gelassen wie es ist.

    Vielleicht kann es ja jemand gebrauchen. :)

    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include 'RegisterWaitForSingleObject.au3'

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

    Global $fExit = False

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

    Local $hPid = Run("notepad.exe")
    Local $hProcess = _WinAPI_OpenProcess(0x00100000, False, $hPid) ; SYNCHRONIZE (0x00100000)
    ControlSetText(WinWait("[CLASS:Notepad]"), "", "[CLASS:Edit; INSTANCE:1]", "Close Editor or wait 3 seconds for timeout")

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

    ;Registers the _TestFunc with a timeout of 3 secs.
    ;The _TestFunc shall be like this: _TestFunc($fTimeout)
    ;where $fTimeout signalise wether timeout reached (True) or event is in signaled state (False)
    _WinAPI_RegisterWaitForSingleObject($hProcess, "_TestFunc", 3000)

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

    While Not $fExit
    ConsoleWrite("Do some stuff at " & @HOUR & ":" & @MIN & ":" & @SEC & "." & @MSEC & @CRLF)
    Sleep(500)
    WEnd

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

    ConsoleWrite("Bye" & @CRLF)
    _WinAPI_CloseHandle($hProcess)

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

    Func _TestFunc($fTimeout)
    If $fTimeout Then
    ConsoleWrite("Timeout reached" & @CRLF)

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

    Else
    ConsoleWrite("Object is in signaled state" & @CRLF)
    EndIf
    $fExit = True
    EndFunc ;==>_TestFunc

    [/autoit]

    lg,
    Spider