In folgendem Code tauchen sporadisch seltsame Fehler auf die ich mir momentan nicht wirklich erklären kann. Manchmal läuft der Code ohne Probleme durch, manchmal werden Fehler wie "undeclared Variable" angezeigt an Stellen wo gar keine Variable ist. Manchmal stürzt AutoIt ohne jegliche Rückmeldung ab.
Spoiler anzeigen
; -Author: name22 (http://www.autoit.de)
Global Const $WT_EXECUTEDEFAULT = 0x00000000
Global Const $WT_EXECUTEINIOTHREAD = 0x00000001
Global Const $WT_EXECUTEINTIMERTHREAD = 0x00000020
Global Const $WT_EXECUTEINPERSISTENTTHREAD = 0x00000080
Global Const $WT_EXECUTELONGFUNCTION = 0x00000010
Global Const $WT_EXECUTEONLYONCE = 0x00000008
Global Const $WT_TRANSFER_IMPERSONATION = 0x00000100
$hDll_Kernel32 = DllOpen("kernel32.dll")
[/autoit] [autoit][/autoit] [autoit]$hCallBack = DllCallbackRegister("_Callback", "NONE", "LPARAM;INT")
$hTimer = _CreateTimerQueueTimer($hCallBack, 12345, 200, 200, Default, Default, $hDll_Kernel32)
ConsoleWrite("Before Callback" & @CRLF)
Sleep(2000)
ConsoleWrite("Deleting: " & _DeleteTimerQueueTimer($hTimer, 0, 0, $hDll_Kernel32) & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Sleep(1000)
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite("After Callback" & @CRLF)
DllClose($hDll_Kernel32)
DllCallbackFree($hCallBack)
Func _Callback($lParam, $TimerOrWaitFired)
ConsoleWrite("Callback Parameter: " & $lParam & @CRLF)
EndFunc
Func _CreateTimerQueueTimer($hTimer_Callback, $iParameter, $iDueTime, $iPeriod = 0, $iFlags = $WT_EXECUTEDEFAULT, $hTimerQueue = 0, $hDll_Kernel32 = "kernel32.dll")
Local $thTimerHandle = DllStructCreate("HANDLE")
Local $aRes = DllCall($hDll_Kernel32, "BOOL", "CreateTimerQueueTimer", "PTR", DllStructGetPtr($thTimerHandle), "HANDLE", 0, "PTR", DllCallbackGetPtr($hTimer_Callback), "INT", $iParameter, "DWORD", $iDueTime, "DWORD", $iPeriod, "ULONG", $iFlags)
If @error Then Return SetError(@error, @extended, 0)
If Not $aRes[0] Then Return SetError(2, 0, 0)
Return DllStructGetData($thTimerHandle, 1)
EndFunc
Func _DeleteTimerQueueTimer($hTimer, $hCompletionEvent = 0, $hTimerQueue = 0, $hDll_Kernel32 = "kernel32.dll")
Local $aRes = DllCall($hDll_Kernel32, "BOOL", "DeleteTimerQueueTimer", "HANDLE", $hTimerQueue, "HANDLE", $hTimer, "HANDLE", $hCompletionEvent)
If @error Then Return SetError(@error, @extended, 0)
Return $aRes[0]
EndFunc
Hier sind noch die Links zu MSDN Artikeln der Kernelfunktionen die ich versuche zu verwenden:
http://msdn.microsoft.com/de-de/library/…esktop/ms682485
http://msdn.microsoft.com/de-de/library/…esktop/ms682569
Alle Timer werden für die Default TimerQueue erstellt, somit sollte das Löschen der Liste nicht nötig sein.
PS: Ich suche nicht nach einer Alternative zu diesen Timern, sondern nach einer Lösung für dieses Problem ;).