Sign in to follow this  
Followers 0
Miliardsto

Timers Crashing

3 posts in this topic

I do my timers like this by clicking checkbox function is called and timer is set up.

There is a trouble cause I got so many Timers, 20 like this below and I can see if they is launched 5 timers program starts freezing and often crashing.

I know it takes memory but is is right way to do timers like that or what should i do?

Case $checkerSS
                If GUICtrlRead($CheckerOne) = 1 Then
                    $ss = _Timer_SetTimer($Form1,4000,"checkScreen")
                Else
                    _Timer_KillTimer ($Form1,$ss)
                EndIf

            Case $checkerPos
                If GUICtrlRead($DiscAlert) = 1 Then
                    $disc = _Timer_SetTimer($Form1,20000,"checkPosition")
                Else
                    _Timer_KillTimer ($Form1,$disc)
                EndIf

            Case $checkerVars
                If GUICtrlRead($AlertPlayerPos) = 1 Then
                    $ap = _Timer_SetTimer($Form1,15000,"checkVars")
                Else
                    _Timer_KillTimer ($Form1,$ap)
                EndIf

 

Share this post


Link to post
Share on other sites



Post a full runable (reproducer) and i will have a look.

Share this post


Link to post
Share on other sites

_Timer_SetTimer is gonna register a lot of callback functions, which could be fine but it seems to be breaking your script. Perhaps some of your functions are overlapping because they're taking too long to finish? If you use TimerInit it's just gonna return an int value that can be used in TimerDiff to get the passed time, no callbacks needed. Instead of registering 20 callbacks you could create 20 variables from TimerInit and keep track of the timers yourself

HotKeySet("{Esc}", Close)

Global $aTimerArray[20][3]

For $i = 0 to 19
    $aTimerArray[$i][0] = TimerInit()           ; Initialize a timer
    $aTimerArray[$i][1] = MyFunc                ; Function to call when timeout hit
    $aTimerArray[$i][2] = Random(1000, 1500, 1) ; Timeout when to call the function in the [$i][1]
Next

While (True)
    For $i = 0 to 19
        ; If the difference between the timer in [$i][0] is greater than the timeout set, call the function stored in [$i][1]
        ; Passing the timer by reference so the MyFunc function resets it automatically, you could also reset it in this if statement
        If (TimerDiff($aTimerArray[$i][0]) > $aTimerArray[$i][2]) Then $aTimerArray[$i][1]($aTimerArray[$i][0])
    Next
    Sleep(100)
WEnd

Func MyFunc(ByRef $iTimer)
    ConsoleWrite("MyFunc called after " & TimerDiff($iTimer) & "ms for this timer" & @LF)
    $iTimer = TimerInit()
EndFunc

Func Close()
    Exit 0
EndFunc

When it finishes calling the function in [$i][1] even if the next timer is WAYYYY over the timeout, it will still call the function and reset the timer and move on.

Share this post


Link to post
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
Sign in to follow this  
Followers 0

  • Similar Content

    • KB505
      By KB505
      Hello,
       
      I'm starting a script in AutoIT to automize a task in a software. I need to click a several Controls. 
      I'm just starting to learn AutoIT, and discovered that we can use the Window Info tool (au3info) to identify controls precisely and targetting safely a specific button.
      However, when I try it, I realize that most of the controls in my toolbar have the same Control Info (No ID, same class, same instance, ...). The only thing that changes is the ControlClicks Coord but I don't think that it's interesting, I don't see the difference with the Mouse Coordinates. Besides, I was aiming to write a stable script that would work even if the button changes a little bit of place for example. 
      Should I use another tool that Window Info tool to detect this Controls ? Is there another way to identify a Control ? 
      Thank you in advance for your help
       
    • lattey
      By lattey
      I have a system that need to operates at Windows NT environment. So, i am using old version autoit - ver 3.2.12.1, since only old version that compatible with windows NT. But i face some error which i couldn't figure out why it is happen. The error only happen after running the system few times. i suspected it is may due to i am using old version autoit but i am not
      sure about it. 
      Errors that I faced:
       Send command send wrong keys - after few times, autoit will send wrong keys. The autoit will send Start keys. WinActivate("Program Selection") send ("{UP}") ;loop start to delete test prog local $j = 0 Do send ("{DOWN}") Sleep (200) ControlClick("Program Selection", "", "[CLASS:Button; INSTANCE:3]") Sleep (500) $j = $j + 1 until $j = 10 The button not appear - after running few times, the button suddenly not appear SplashTextOn("", "successfully Load. ", 300, 120, (@DesktopWidth - 330) / 2, (@DesktopHeight - 339) / 2, 0, "", 16) Sleep(10000) SplashOff() GUISetFont(7, 400, "Tahoma") ; will display underlined characters $CmdPrint = GUICtrlCreateButton("PRINT",6,420,295,30,$BS_MULTILINE) there also few error that happens after few times running which doesnt not capture. is this maybe because i am using the old version of autoit? How can i proved all this error happen may not because of my code?
    • TwistedXion
      By TwistedXion
      Ok so I'm making a game in auto it and I need some help with optimizing the code(making it shorter/faster or better ways of doing things) and if you could when you make suggestions please explain why you suggest those changes as I'm very new to autoit and am doing this project just to learn more about the language (first computer language I have ever tried to learn)
      thanks for any help in advance, also you may need to uncomment the #requireAdmin as it does need to make a dir to save a .ini file where all the info about your character.
       
      ps I know it's not much of a game but I have only been working on the code for a few hours and I will be adding a lot more stuff, so this is by no mean finished. 
      #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <ProgressConstants.au3> #include <StaticConstants.au3> ;~ #RequireAdmin Global $nClickButtonCount = 0 Global $pDamage = 0 Global $bDamage = 0 Global $fPath = @AppDataCommonDir & "\Fantom\Path" Global $pGold = IniRead($fPath & "\" & "InFo", "Item", "Gold", "1000") Global $cTName = IniRead($fPath & "\" & "InFo", "Name", "ToonName", "") Global $cUName = IniRead($fPath & "\" & "InFo", "Name", "UserName", "") #Region ### START mm GUI section ### $mm = GUICreate("MainMenu", 238, 199, 337, 189) $tName = GUICtrlCreateInput($cTName, 64, 64, 113, 21) $uName = GUICtrlCreateInput($cUName, 64, 120, 113, 21) GUICtrlCreateLabel("ToonName", 90, 40, 57, 17) GUICtrlCreateLabel("UserName", 91, 96, 54, 17) $Enter = GUICtrlCreateButton("Enter", 90, 151, 57, 41) GUISetState(@SW_SHOW, $mm) #EndRegion ### START mm GUI section ### #Region ### START Town GUI section ### $Town = GUICreate("Town", 387, 316, 396, 122) $TGroup1 = GUICtrlCreateGroup("", 0, 0, 385, 313) $TButton1 = GUICtrlCreateButton("Inn", 8, 8, 57, 33) $TButton2 = GUICtrlCreateButton("Wild", 320, 8, 57, 33) $TButton3 = GUICtrlCreateButton("Gen store", 8, 48, 57, 33) GUISetState(@SW_HIDE, $Town) #EndRegion ### START Town GUI section ### #Region ### START Wild GUI section ### $Wild = GUICreate("Wild", 387, 316, 396, 122) $WGroup1 = GUICtrlCreateGroup("", 0, 0, 385, 313) $WButton1 = GUICtrlCreateButton("Town", 8, 8, 57, 33) $WButton2 = GUICtrlCreateButton("Fight", 320, 8, 57, 33) GUISetState(@SW_HIDE, $Wild) #EndRegion ### START Wild GUI section ### #Region ### START Fight GUI section ### $Fight = GUICreate("Fight", 390, 319, 396, 122) $listview = GUICtrlCreateListView("Your Damage | Eneime Damage | Your HP | Eneime HP", 2, 146, 386, 150) $Progress1 = GUICtrlCreateProgress(8, 32, 185, 25) $Progress2 = GUICtrlCreateProgress(200, 32, 185, 25) $YourHP = GUICtrlCreateLabel("YourHP", 8, 8, 41, 17) $EneimeHP = GUICtrlCreateLabel("EneimeHP", 200, 8, 56, 17) $Start = GUICtrlCreateButton("Start", 158, 80, 73, 41) $Attack = GUICtrlCreateButton("Attack", 158, 80, 73, 41) GUISetState(@SW_HIDE, $Fight) #EndRegion ### START Fight GUI section ### #Region ### START Inn GUI section ### $Inn = GUICreate("Inn", 390, 319, 396, 122) $hpdisplay = GUICtrlCreateLabel("You have " & $pGold & " gold", 16, 8, 100, 100) $fullH = GUICtrlCreateButton("Heal", 8, 111, 73, 57) $drink = GUICtrlCreateButton("Drink", 120, 111, 73, 57) $eat = GUICtrlCreateButton("eat", 232, 111, 73, 57) $bttown = GUICtrlCreateButton("town", 8, 250, 73, 57) $fRHP = GUICtrlCreateLabel("Fully Restore HP", 0, 96, 83, 17) $aHPlDam = GUICtrlCreateLabel("Adds more HP" & @LF & "lowers Dammage", 232, 80, 83, 30) $Label1 = GUICtrlCreateLabel("Add more Dammage" & @LF & "Lower HP", 120, 80, 100, 30) GUISetState(@SW_HIDE, $Inn) #EndRegion ### START Inn GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Enter $iniTName = GUICtrlRead($tName) $iniUName = GUICtrlRead($uName) DirCreate($fPath) IniWrite($fPath & "\" & "InFo", "Name", "ToonName", $iniTName) IniWrite($fPath & "\" & "InFo", "Name", "UserName", $iniUName) GUIDelete($mm) GUISetState(@SW_SHOW, $Town) Case $TButton2 GUISetState(@SW_HIDE, $Town) GUISetState(@SW_SHOW, $Wild) Case $WButton1 GUISetState(@SW_HIDE, $Wild) GUISetState(@SW_SHOW, $Town) Case $WButton2 GUISetState(@SW_HIDE, $Wild) GUISetState(@SW_SHOW, $Fight) Case $Start GUICtrlDelete($Start) GUISetState(@SW_SHOW) Start() Case $Attack Dice() Case $TButton1 GUISetState(@SW_HIDE, $Town) GUISetState(@SW_SHOW, $Inn) Case $bttown GUISetState(@SW_HIDE, $Inn) GUISetState(@SW_SHOW, $Town) Case $fullH GUICtrlSetData($Progress1, 100) If $pGold >= 100 Then IniWrite($fPath & "\" & "InFo", "Item", "Gold", $pGold - 100) $pGold = IniRead($fPath & "\" & "InFo", "Item", "Gold", "1000") GUICtrlSetData($hpdisplay, "You have " & $pGold & " gold") Else MsgBox(1, "Sorry", "You do not have enough gold for that action", 1) EndIf EndSwitch WEnd Func Start() GUICtrlSetData($Progress1, 100) GUICtrlRead($Progress1) GUICtrlSetData($Progress2, 100) GUICtrlRead($Progress2) EndFunc ;==>Start Func Dice() Global $pDamage = Random(1, 20, 1) Global $bDamage = Random(1, 20, 1) Global $gGold = Random(0, 50, 1) Damage() EndFunc ;==>Dice Func Damage() $cpHP = GUICtrlRead($Progress1) $cbHP = GUICtrlRead($Progress2) $pHP = $cpHP - $bDamage $bHP = $cbHP - $pDamage GUICtrlSetData($Progress1, $pHP) GUICtrlSetData($Progress2, $bHP) GUICtrlRead($Progress1) GUICtrlRead($Progress2) $listview = GUICtrlCreateListView("Your Damage | Eneime Damage | Your HP | Eneime HP", 2, 146, 386, 150) GUICtrlCreateListViewItem($pDamage & "|" & $bDamage & "|" & $pHP & "|" & $bHP, $listview) If $pHP <= 0 And $bHP <= 0 Then IniWrite($fPath & "\" & "InFo", "Item", "Gold", $pGold + $gGold) GUICtrlDelete($listview) GUISetState(@SW_HIDE, $Fight) GUISetState(@SW_SHOW, $Town) Global $pGold = IniRead($fPath & "\" & "InFo", "Item", "Gold", "1000") MsgBox(1, "Draw", "You Draw..." & @LF & "You get " & $gGold & " gold" & @LF & " you now have " & $pGold) GUICtrlSetData($Progress2, 100) ElseIf $bHP <= 0 Then IniWrite($fPath & "\" & "InFo", "Item", "Gold", $pGold + $gGold) GUICtrlDelete($listview) GUISetState(@SW_HIDE, $Fight) GUISetState(@SW_SHOW, $Town) Global $pGold = IniRead($fPath & "\" & "InFo", "Item", "Gold", "1000") MsgBox(1, "Win", "You win..." & @LF & "You get " & $gGold & " gold" & @LF & " you now have " & $pGold) GUICtrlSetData($Progress2, 100) ElseIf $pHP <= 0 Then GUICtrlDelete($listview) GUISetState(@SW_HIDE, $Fight) GUISetState(@SW_SHOW, $Town) GUICtrlSetData($Progress2, 100) Global $pGold = IniRead($fPath & "\" & "InFo", "Item", "Gold", "1000") MsgBox(1, "Death", "You died...") $t = MsgBox(4, "Dead", "Would you like to revive") If $t = 6 Then $pGold = IniRead($fPath & "\" & "InFo", "Item", "Gold", "1000") If $pGold < 25 Then GUICtrlSetData($Progress1, 75) Else $pGold = $pGold - 25 GUICtrlSetData($Progress1, 100) Global $pGold = IniRead($fPath & "\" & "InFo", "Item", "Gold", "1000") IniWrite($fPath & "\" & "InFo", "Item", "Gold", $pGold + $gGold) MsgBox(1, "Revived", "Your new gold amount is " & $pGold) EndIf ElseIf $t = 7 Then Exit EndIf EndIf EndFunc ;==>Damage  
    • quimao
      By quimao
      Hi Autoit team, i just got this bug today and not sure i'm right
       
      $VLC_path = FileOpenDialog("Select file folder", @ScriptDir, "vlc.exe (vlc.exe)" ,1) IniWrite("VLC_convert.ini","VLC","VLCpath",$VLC_path) ;~ or ;~ IniWrite("VLC_convert.ini","VLC","VLCpath","anything here")  
    • swatsapkraz
      By swatsapkraz
      First script here. Thanks for taking the time.
      I want to download a file from my dropbox or other cloud file host and I want autoit to read the file and proceed.
      Here are the references I've gone through, it's just I'm not familiar yet with autoit so I'm looking for advice:
      https://www.autoitscript.com/autoit3/docs/functions/InetGet.htm
      https://www.autoitscript.com/autoit3/docs/functions/FileRead.htm
       
      How would I start out downloading a text file from dropbox and if in the file there is a 1 then it will proceed with the rest of the script if there is a 0 or if the file cannot be downloaded I want it to just end.
       
      Thank you for taking the time to read this and I apologize in advance if this seems very trivial for some but this is my first script and I'm hoping this is the correct place to ask this question.