AdLib-Funktion in OnEvent-Modus zu langsam?

  • Morgen,

    ich nutze den OnEvent-Modus in einer GUI. Wenn ich aber eine AdLib-Funktion alle 100 ms aufrufen möchte, wird sie nur ca. alle 300 ms aufgerufen.
    Bremst der OnEvent-Modus irgendwie aus?

  • Hast du vielleicht mal ein entsprechendes Minimalbeispiel an dem man diesen Effekt nachvollziehen könnte?

    Adlib kann nur in Ruhezeiten des Skriptes ausgeführt.werden daher ist der Zeitpunkt von Adlib schon vom Rest abhängig.
    Kommt halt darauf an wie dein Skript konkret aussieht und was es alles noch macht.
    Es könnte ja z.b. auch sein das er für die Ausführung deiner Adlibfunktion länger als 100ms benötigt oder ähnliches.

    Prinzipiell klappt es bei mir auch mit 100ms und dem OnEvent-Mode.
    Erst wenn das Skript anderweitig ausgelastet wird kommt die Adlibfunktion natürlich nicht zur Ausführung:

    Adlib-OnEvent-Test
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $h_GUI = GUICreate("Test")
    GUISetOnEvent($GUI_EVENT_CLOSE, "MainFuncs")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "MainFuncs")
    GUISetOnEvent($GUI_EVENT_RESTORE, "MainFuncs")

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

    AdlibRegister ("AdlibTest" , 100)
    GUISetState()

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

    While Sleep(100)
    WEnd

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

    Func MainFuncs()
    Switch @GUI_CtrlId
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_MINIMIZE
    GUISetState(@SW_MINIMIZE)
    Case $GUI_EVENT_RESTORE
    GUISetState(@SW_RESTORE)
    EndSwitch
    EndFunc

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

    Func AdlibTest()
    Local Static $i_T = TimerInit()
    Local $f_T = Round(TimerDiff($i_T),1)
    ToolTip($f_T)
    ConsoleWrite($f_T & @CRLF)
    $i_T = TimerInit()
    EndFunc

    [/autoit]
  • Minimal ist blöd, hier mal das ganze.
    Ich glaube es liegt an den WinHTTP-Funktionen.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <String.au3>
    #include <WinHttp.au3>
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $sLine, $aPPOs[1][2], $aSS, $hTimer
    Global $sTitle = "ILC PDD Request"

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

    If Not FileExists(@ScriptDir & "\PDD.csv") Then
    MsgBox(48, $sTitle & " - Error", "Can't find PDD.csv.")
    Exit
    EndIf

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

    Global $hFile = FileOpen(@ScriptDir & "\PDD.csv")

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

    While 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop
    $aSS = StringSplit($sLine, ",")
    $aPPOs[UBound($aPPOs) - 1][0] = $aSS[1]
    $aPPOs[UBound($aPPOs) - 1][1] = $aSS[2]
    ReDim $aPPOs[UBound($aPPOs) + 1][2]
    Wend

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

    FileClose($hFile)
    _ArrayDelete($aPPOs, UBound($aPPOs))

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

    Global $hGui = GUICreate($sTitle, 600, 400, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
    GUICtrlCreateLabel("ILC IP-Address:", 20, 25, 80, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cIP = GUICtrlCreateInput("192.168.0.2", 100, 22, 90, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cRequest = GUICtrlCreateButton("Request", 220, 20, 80, 25)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cAutoRequest = GUICtrlCreateCheckbox("Auto Request", 320, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    GUICtrlCreateLabel("Update Time:", 420, 25, 80, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cUpdateTime = GUICtrlCreateCombo("100", 490, 22, 50, 20, $CBS_DROPDOWNLIST)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    GUICtrlSetData(-1, "200|400|500|1000")
    GUICtrlCreateLabel("ms", 545, 25, 20, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE)
    $cListview = GUICtrlCreateListView("PDD|Data Type|Value", 10, 60, 580, 315, -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM)
    Global $acContextMenu[UBound($aPPOs) - 1]
    Global $acContextMenu_Set[UBound($aPPOs) - 1]
    For $i = 1 To UBound($aPPOs) - 1
    $cItem = GUICtrlCreateListViewItem($aPPOs[$i][0] & "|" & $aPPOs[$i][1], $cListview)
    $cContextMenu = GUICtrlCreateContextMenu($cItem)
    GUICtrlCreateMenuItem("Set", $cContextMenu)
    GUICtrlSetOnEvent(-1, "_SetVar")
    Next
    _GUICtrlListView_SetColumnWidth($cListview, 0, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($cListview, 1, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($cListview, 2, $LVSCW_AUTOSIZE_USEHEADER)
    GUICtrlCreateLabel("Real Update Time:", 20, 380, 100, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    $cUpdateTimeReal = GUICtrlCreateLabel("", 115, 380, 80, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
    GUISetState()

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

    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUICtrlSetOnEvent($cRequest, "_GetValues")
    GUICtrlSetOnEvent($cAutoRequest, "_AutoRequest")

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

    While 1
    Sleep(20)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _AutoRequest()
    $hTimer = ""
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($cIP, $GUI_DISABLE)
    GUICtrlSetState($cRequest, $GUI_DISABLE)
    GUICtrlSetState($cUpdateTime, $GUI_DISABLE)
    AdlibRegister("_GetValues", Int(GUICtrlRead($cUpdateTime)))
    Else
    GUICtrlSetState($cIP, $GUI_ENABLE)
    GUICtrlSetState($cRequest, $GUI_ENABLE)
    GUICtrlSetState($cUpdateTime, $GUI_ENABLE)
    AdlibUnRegister("_GetValues")
    EndIf
    EndFunc

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

    Func _GetValues()
    Local $aValues, $sXML, $sXMLResponse

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

    If $hTimer <> "" Then GUICtrlSetData($cUpdateTimeReal, Round(TimerDiff($hTimer)) & " ms")
    $hTimer = TimerInit()
    $sXML = _CreateXMLString($aPPOs)
    $sXMLResponse = _SendHTTPRequest(GUICtrlRead($cIP), $sXML)
    If @error Then Return SetError(1)
    $aValues = _StringBetween($sXMLResponse, "</n><v>", "</v></i>")

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

    If Not @error Then
    _GUICtrlListView_BeginUpdate($cListview)
    For $i = 1 To UBound($aPPOs) - 1
    If _GUICtrlListView_GetItemText($cListview, $i - 1, 2) <> $aValues[$i - 1] Then
    _GUICtrlListView_SetItemText($cListview, $i - 1, $aValues[$i - 1], 2)
    EndIf
    Next
    _GUICtrlListView_EndUpdate($cListview)
    EndIf
    EndFunc

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

    Func _SetVar()
    Local $sValue, $sDataType
    Local $aSelectedItems = _GUICtrlListView_GetSelectedIndices($cListview, 1)

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

    If $aSelectedItems[0] = 1 Then
    $sDataType = _GUICtrlListView_GetItemText($cListview, $aSelectedItems[1], 1)
    Switch $sDataType
    Case "BOOL"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return 0
    If $sValue = "true" Then $sValue = "1"
    If $sValue = "false" Then $sValue = "0"
    If $sValue = "1" Or $sValue = "0" Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case "DINT"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return 0
    If Int($sValue) >= -2147483648 And Int($sValue) <= 2147483647 And StringIsInt($sValue) Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case "INT"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return 0
    If Int($sValue) >= -32768 And Int($sValue) <= 32767 And StringIsInt($sValue) Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case "STRING(80)"
    While 1
    $sValue = InputBox($sTitle, "Enter the new value to set the variable.", "", "", 240, 130, Default, Default, 0, $hGui)
    If $sValue = "" Then Return 0
    If StringLen($sValue) <= 80 Then ExitLoop
    MsgBox(48, $sTitle & " - Error", "(Platzhalter)", 0, $hGui)
    WEnd
    Case Else
    MsgBox(48, $sTitle & " - Error", "Data type not supported. Please contact the developer.", 0, $hGui)
    Return SetError(1)
    EndSwitch
    _SendHTTPRequest(GUICtrlRead($cIP), "","Write", _GUICtrlListView_GetItemText($cListview, $aSelectedItems[1], 0), $sValue)
    If @error Then Return SetError(2)
    _GetValues()
    EndIf
    EndFunc

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

    Func _CreateXMLString($aVars)
    Local $sXML

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

    $sXML = "<body><version>1.0</version><client>IMasterPhoenix5_14_05</client><client_ver>5.14.0501</client_ver><item_list_size>" & UBound($aVars)
    $sXML &= "</item_list_size><item_list>"

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

    For $i = 1 To UBound($aVars) - 1
    $sXML &= "<i><n>" & $aVars[$i][0] & "</n></i>"
    Next

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

    $sXML &= "</item_list></body>"

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

    Return $sXML
    EndFunc

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

    Func _SendHTTPRequest($sIP, $sXML = "",$sCommand = "Read", $sVar = "", $sValue = "")
    Local $sData, $sRet, $sVerb, $sObjectName
    Local $hOpen = _WinHttpOpen()
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error initializing the usage of WinHTTP functions.", 0, $hGui)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(1)
    EndIf

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

    Local $hConnect = _WinHttpConnect($hOpen, $sIP)
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error specifying the initial target server of an HTTP request. (Error: " & _WinAPI_GetLastError() & ")", 0, $hGui)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(2)
    EndIf

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

    Switch $sCommand
    Case "Read"
    $sVerb = "POST"
    $sObjectName = "/cgi-bin/ILRReadValues.exe"
    Case "Write"
    $sVerb = "GET"
    $sObjectName = "/cgi-bin/writeVal.exe?" & $sVar & "+" & $sValue
    Case Else
    Return SetError(7)
    EndSwitch

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

    Local $hRequest = _WinHttpOpenRequest($hConnect, $sVerb, $sObjectName, "HTTP/1.0")
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error creating an HTTP request handle.", 0, $hGui)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(3)
    EndIf

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

    _WinHttpSendRequest($hRequest, Default, $sXML)
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error sending specified request.", 0, $hGui)
    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(4)
    EndIf
    _WinHttpReceiveResponse($hRequest)
    If @error Then
    MsgBox(48, $sTitle & " - Error", "Error waiting for the response from the server.", 0, $hGui)
    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(5)
    EndIf
    If _WinHttpQueryDataAvailable($hRequest) Then
    While 1
    $sData = _WinHttpReadData($hRequest)
    If @error Then ExitLoop
    $sRet &= $sData
    WEnd
    Else
    MsgBox(48, $sTitle & " - Error", "Site is experiencing problems.", 0, $hGui)
    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If BitAND(GUICtrlRead($cAutoRequest), $GUI_CHECKED) = $GUI_CHECKED Then
    ControlClick($hGui, "", $cAutoRequest)
    AdlibUnRegister("_GetValues")
    EndIf
    Return SetError(6)
    EndIf

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

    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)

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

    Return $sRet
    EndFunc

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

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, 600 + 8) ; min X
    DllStructSetData($minmaxinfo, 8, 400 + 34) ; min Y
    DllStructSetData($minmaxinfo, 9, @DesktopWidth) ; max X
    DllStructSetData($minmaxinfo, 10, @DesktopHeight) ; max Y
    Return 0
    EndFunc ;==>MY_WM_GETMINMAXINFO

    [/autoit]
  • Tja schwierig zu sagen da ich das ja nicht testen kann.
    Du könntest ja z.B. einfach mal am Anfang der Funktion _GetValues() ein TimerInit() und am Ende ein Timerdiff() setzen um herauszufinden wie lange die Funktion eigentlich für einen Durchlauf benötigt.
    Wenn es unter 100ms sind wird das Skript an anderer Stelle beschäftigt sein weswegen der Adlibaufruf erst später wieder einsetzt.

  • Danke AJ, es liegt an der Funktion, die braucht bei mir ca. 300ms. Aber das ist wegen der Kommunikation. Bei jemand anderen hab ich es auch mal getestet, da kommt sie auf unter 100ms. Laptop ist halt zu langsam.^^