Jump to content

Setting timers with WinApi and callbacks functions - wrong number of params


Miliardsto
 Share

Recommended Posts

We have here a working script (Found on this forum - someone said its best way to set timers)

I want to set timers in my program cause AdLibRegister crashes, infinite loops etc.

Its a working small program to test these timers below.

#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>


Global $iMemo

_Main()

Func _Main()
    Global $hGUI

    Global $timerID1 = 1, $timerID2 = 2
    Global $callBackFunc1, $callBackFunc2
    Global $timerName1, $timerName2

    $hGUI = GUICreate("My Timers", 400, 296)
    $iMemo = GUICtrlCreateEdit("", 2, 32, 396, 226, BitOR($WS_HSCROLL, $WS_VSCROLL))
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

    setTimer($callBackFunc1, $timerName1, $timerID1, 1000, 'hello')
    setTimer($callBackFunc2, $timerName2, $timerID2, 2000, 'hello2')


    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd

    killTimer($timerName1, $callBackFunc1)
    killTimer($timerName2, $callBackFunc2)

EndFunc   ;==>_Main



; =================  MY FUNCS ============================



Func setTimer(ByRef $callBackFunc, ByRef $timerName, $timerID = 1, $time = 1000, $funcName = 'hello')

    $callBackFunc = DllCallbackRegister($funcName, "none", "hwnd;int;int;dword")
    $timerName = _WinAPI_SetTimer($hGUI, $timerID, $time, DllCallbackGetPtr($callBackFunc))

EndFunc

Func killTimer($timerName, $callBackFunc)
    _WinAPI_KillTimer($hGUI, $timerName)
    DllCallbackFree($callBackFunc)
EndFunc

; =============================================

; Write a line to the memo control
Func MemoWrite($sMessage)
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite

Func _WinAPI_KillTimer($hWnd, $iIDEvent)
    Local $iResult = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int", $iIDEvent)
    If @error Then Return SetError(-1, -1, 0)
    Return $iResult[0] <> 0
EndFunc   ;==>_WinAPI_KillTimer

Func _WinAPI_SetTimer($hWnd, $iIDEvent, $iElapse, $pTimerFunc = 0)
    Local $iResult = DllCall("user32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", $iIDEvent, "int", $iElapse, "ptr", $pTimerFunc)
    If @error Then Return SetError(-1, -1, 0)
    Return $iResult[0]
EndFunc   ;==>_WinAPI_SetTimer

Func _TimerCallBackFunc($hWnd, $Msg, $iIDTimer, $dwTime)
    MemoWrite("Timer " & $iIDTimer & " Fired")
    For $i = 999 To 1 Step -1
        ConsoleWrite($i & @CRLF)
    Next
EndFunc   ;==>_TimerCallBackFunc


; ============== Funs to call ===============================


Func hello($hWnd, $nMsg, $iIDTimer, $dwTime)
    MemoWrite("Timer " & $iIDTimer & " Fired")
    For $i = 999 To 1 Step -1
        ConsoleWrite($i & @CRLF)
    Next
EndFunc   ;==>_TimerCallBackFunc

Func hello2($hWnd, $nMsg, $iIDTimer, $dwTime)
    MemoWrite("Timer " & $iIDTimer & " Fired")
    For $i = 999 To 1 Step -1
        ConsoleWrite($i & @CRLF)
    Next
EndFunc   ;==>_TimerCallBackFunc

And i wanted to apply these timers to my final program.

I get error:

error: doingThings() called by a previous line with 0 arg(s). Min = 4. First previous line calling this Func is 31.
Func doingThings($hWnd, $nMsg, $iIDTimer, $dwTime)

There are pieces of code below:

There I replaced AdlibRegister by setTimer and calling it like in previous working program (just doingThings in last param in setTimer function)

Func r_offOn_doingThings()
    If _Metro_CheckboxIsChecked($r_offOn_doingThings) Then
        _Metro_CheckboxUnCheck($r_offOn_doingThings)
        ;AdlibUnRegister("doingThings")
        killTimer($timerName1, $callBackFunc1)
    Else
        If _checkDeclared(True,False) == False Then ; check if is declared to run func (HP,TITLE,REGION)- core_funcs
        Else
            _Metro_CheckboxCheck($r_offOn_doingThings)
            setTimer($callBackFunc1, $timerName1, 1, 1600, "doingThings")
            ;AdlibRegister("doingsThings", 1800)
        EndIf
    EndIf
EndFunc

And function name with params looks like this

Func doingThings($hWnd, $nMsg, $iIDTimer, $dwTime)
EndFunc

#include Timers.au3

#cs

THere are globals vars: globalVariables/timers

ByRef $callBackFunc: var
ByRef $timerName: var
$timerID = 1: var ID
$time = 1000: how often call func
$funcName: function to call

#CE

Global $timerID1 = 1, $timerID2 = 2
Global $callBackFunc1, $callBackFunc2
Global $timerName1, $timerName2


Func setTimer(ByRef $callBackFunc, ByRef $timerName, $timerID = 1, $time = 1000, $funcName = "doingThings")

    $callBackFunc = DllCallbackRegister($funcName, "none", "hwnd;int;int;dword")
    $timerName = _WinAPI_SetTimer($GUI, $timerID, $time, DllCallbackGetPtr($callBackFunc))

EndFunc

Func killTimer($timerName, $callBackFunc)
    _WinAPI_KillTimer($GUI, $timerName)
    DllCallbackFree($callBackFunc)
EndFunc


Func _WinAPI_KillTimer($hWnd, $iIDEvent)
    Local $iResult = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int", $iIDEvent)
    If @error Then Return SetError(-1, -1, 0)
    Return $iResult[0] <> 0
EndFunc   ;==>_WinAPI_KillTimer

Func _WinAPI_SetTimer($hWnd, $iIDEvent, $iElapse, $pTimerFunc = 0)
    Local $iResult = DllCall("user32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", $iIDEvent, "int", $iElapse, "ptr", $pTimerFunc)
    If @error Then Return SetError(-1, -1, 0)
    Return $iResult[0]
EndFunc   ;==>_WinAPI_SetTimer

Thats it.

And why in first working program it does not say this function below is calling with 0 args but Min is 4?

setTimer($callBackFunc1, $timerName1, 1, 1600, "doingThings") 

When I applied this code to my final program it wants 4 arguments in function call. I rode i cant pass parameters to the callback func .

What I have to do.

I tried something like this:

Func doingThings($hWnd = Default, $nMsg = Default, $iIDTimer = Default, $dwTime = Default)

but then function is not working dont know whats going on

Edited by Miliardsto
Link to comment
Share on other sites

What about posting the script that actually don't work instead of us guessing what are you trying to do? I mean, the error it's obvious, you call the function doingThings() without parameters when the function has 4 parameters and none of them is optional but the fix it's not so obvious without seeing the actual code.

Edited by Andreik

When the words fail... music speaks.

Link to comment
Share on other sites

At least create a script that reproduce your issue. Believe me or not the code that doesn't work is not the same as the working one. In the working example I can't see any calls of hello or hello2 without parameters. If you still want to call doingThings() without parameters make them optional and set some default values for each parameter.

When the words fail... music speaks.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...