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?
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:
#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")
AdlibRegister ("AdlibTest" , 100)
GUISetState()
While Sleep(100)
WEnd
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
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
Minimal ist blöd, hier mal das ganze.
Ich glaube es liegt an den WinHTTP-Funktionen.
#include <Array.au3>
#include <String.au3>
#include <WinHttp.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global $sLine, $aPPOs[1][2], $aSS, $hTimer
Global $sTitle = "ILC PDD Request"
If Not FileExists(@ScriptDir & "\PDD.csv") Then
MsgBox(48, $sTitle & " - Error", "Can't find PDD.csv.")
Exit
EndIf
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
FileClose($hFile)
_ArrayDelete($aPPOs, UBound($aPPOs))
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()
GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")
[/autoit] [autoit][/autoit] [autoit]GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUICtrlSetOnEvent($cRequest, "_GetValues")
GUICtrlSetOnEvent($cAutoRequest, "_AutoRequest")
While 1
Sleep(20)
WEnd
Func _Exit()
Exit
EndFunc
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
Func _GetValues()
Local $aValues, $sXML, $sXMLResponse
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>")
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
Func _SetVar()
Local $sValue, $sDataType
Local $aSelectedItems = _GUICtrlListView_GetSelectedIndices($cListview, 1)
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
Func _CreateXMLString($aVars)
Local $sXML
$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>"
For $i = 1 To UBound($aVars) - 1
$sXML &= "<i><n>" & $aVars[$i][0] & "</n></i>"
Next
$sXML &= "</item_list></body>"
[/autoit] [autoit][/autoit] [autoit]Return $sXML
EndFunc
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
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
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
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
_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
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
Return $sRet
EndFunc
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 + ; 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
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.^^