# Function priority by timer

## Recommended Posts

Hello, i havê been reading, and thinking.. Im on my tablet só i WLL try explain what im trying to do....

Will havê an GUI with 8 timer input that havê to set timer, but wen our if 2 our more ends at some time it havê to run 1, then outher , then outher

Timer 1, - input 5 minutes, timer 2 - input 10, timer 3 input 15, timer 4 - input 8,......

At some time,  timer 1 will end ate some time of timer 2 / then it at some time will end at some time timer 2 and 3

How i said that wen it happpens first is 2 then 1, then outhers and if 1 is done then 1st is 3, will have more than 9 input boxes that can happen it end at some time, imagine if wen timer 1= 0 function1(), then after end funciona start countdown again, if timer 2 = 0 run function2(), then after end function2 start contdoen again, if both =0 at some time first run 1 then 2, and if wen ends 1, 2,3,4 are =0 :-( :-( :-(  im lost

This work…???

thank you!

lod3n said:

Like this?

expand popup
```\$runNext = 1

For \$i = 1 To 64 Step +1
Select

Case \$runNext = 1
If function1() Then
\$runNext = 1
Else
\$runNext = 2
EndIf

Case \$runNext = 2
If function2() Then
\$runNext = 2
Else
\$runNext = 3
EndIf

Case \$runNext = 3
If function3() Then
\$runNext = 3
Else
\$runNext = 4
EndIf

Case \$runNext = 4
If function4() Then
\$runNext = 4
Else
\$runNext = 1
EndIf

EndSelect
Next

Func function1()
;code
EndFunc

Func function2()
;code
EndFunc

Func function3()
;code
EndFunc

Func function3()
;code
EndFunc```

Thanks for time, any ideas???

##### Share on other sites

Rfsvieira,

I think I understand what you want - if several timers fire simultaneously, you want them to be actioned in a specific order.

If I am right then this script shows you how you might do it by setting the required order in an array like this:

`Global \$aOrder[] = ["2;1" , "3;2;4;1"]`

In this case, when both 1 & 2 fire they will be actioned in the order 2 then 1 - when all four timers fire they will be actioned in the order 3 then 2 then 4 then 1. Any other combination of timers (such as 1 & 3) will always be actioned in numerical order.

And here is the script which shows this happening. As posted, there are no "required orders" and \$aOrder is empty - the timers always fire in numerical order. To change this, change the declaration line for \$aOrder so that holds the "required orders" - then when you run the script the timers will fire in the specified order when a specified combination of timers is actioned:

```#include <Array.au3>

HotKeySet("{ESC}", "_Exit")

; Set number of timers
Global \$iTimer = 4
; Array to hold timers
Global \$aTimer[\$iTimer + 1]
; Array to hold timer limits           1  2   3   4
Global \$aTimerLimit[\$iTimer + 1] = [0, 5, 10, 15, 30]
; Array to hold timers firing
Global \$aTimerFired[\$iTimer + 1]

; First we have no "required orders" - all timers fire in numerical order
Global \$aOrder[0]

; Now set specific order required when multiple timers fire simultaneously - all other combinations fire in numerical order
;Global \$aOrder[] = ["2;1" , "3;2;4;1"]

; Convert "required orders" into suitable code - use powers of 2 so each required timer is unique
; Add a column for the codes
_ArrayColInsert(\$aOrder, 0)
For \$i = 0 To UBound(\$aOrder) - 1
\$aSplit = StringSplit(\$aOrder[\$i][1], ";")
For \$j = 1 To \$aSplit[0]
\$aOrder[\$i][0] += 2 ^ Number(\$aSplit[\$j])
Next
Next

; Just for interest, display final array with codes and orders
_ArrayDisplay(\$aOrder, "", Default, 8)

; Now start timers
For \$i = 1 To \$iTimer
\$aTimer[\$i] = TimerInit()
Next

; Now wait for timmers to fire
\$nLoopTimer = TimerInit()
ConsoleWrite("Timers started at " & @SEC & @CRLF & @CRLF) ; Just for display
While 1

Sleep(10)

; Check every second to allow time for multiple timers to fire
If TimerDiff(\$nLoopTimer) > 1000 Then
; Check each timer
For \$i = 1 To \$iTimer
If TimerDiff(\$aTimer[\$i]) > (\$aTimerLimit[\$i] * 1000) Then
; Set flag for the timer
\$aTimerFired[\$i] = True
; Add unique timer code to the flag
\$aTimerFired[0] += 2 ^ Number(\$i)
; Reset timer
\$aTimer[\$i] = TimerInit()
EndIf
Next

; Check if one or more timers has fired
If \$aTimerFired[0] Then
; See if the total code matches a "required order"
\$iIndex = _ArraySearch(\$aOrder, \$aTimerFired[0], 0, 0, 0, 0, 1, 0)
If \$iIndex = -1 Then
; Then fire in numerical order
For \$i = 1 To \$iTimer
If \$aTimerFired[\$i] Then
; Run function
Call("_Timer_" & \$i)
; Clear flag
\$aTimerFired[\$i] = False
EndIf
Next
Else
; Fire in "required order"
\$aSplit = StringSplit(\$aOrder[\$iIndex][1], ";")
For \$i = 1 To \$aSplit[0]
; Run function
Call("_Timer_" & \$aSplit[\$i])
; Clear flag
\$aTimerFired[\$aSplit[\$i]] = False
Next
EndIf
; Clear master flag
\$aTimerFired[0] = 0

ConsoleWrite(@CRLF) ; Just for display to separate firings

EndIf
; Reset loop timer
\$nLoopTimer = TimerInit()

EndIf

WEnd

Func _Timer_1()
ConsoleWrite("Timer 1 Fired at " & @SEC & @CRLF)
EndFunc

Func _Timer_2()
ConsoleWrite("Timer 2 Fired at " & @SEC & @CRLF)
EndFunc

Func _Timer_3()
ConsoleWrite("Timer 3 Fired at " & @SEC & @CRLF)
EndFunc

Func _Timer_4()
ConsoleWrite("Timer 4 Fired at "  & @SEC & @CRLF)
EndFunc

Func _Exit()
Exit
EndFunc```

I must admit to being quite pleased with that little script. I have tried to comment clearly, but please ask if you have any questions.

M23

Edited by Melba23
More elegant way to detect unique code

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

##### Share on other sites

Hello, thanks

But i dont understand it, with raws and coluns ...

I will try use the sleep() , will conver it in minuts for the inputbox()

then wll try to do the loop, every time it ends the timing add by the user ( ex. 10  minuts) it starts the loop)

I dont know yet how i wll do the priority if 2 our more ends at same time

##### Share on other sites

Rfsviera,

But i dont understand it

What do you not understand? Let me know which parts are causing you difficulty and I can explain in more detail.

M23

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

##### Share on other sites

Happy Xmas, TKS for your time with me i WLL test it soon ans aswer you, but what i havê testes it only works wen i close the window ...

## Create an account

Register a new account

• ### Similar Content

• I was looking for something like this, in the forum and my HDD. Bad hair day. Anyway,
Here is the code
• By Chimp
Simple and generalpurpose stopwatch function

the GUI interface is not a "finished product" but a simple example to show how to use the function.
; --- simple example of use --- #include <GUIConstantsEx.au3> \$Form1_1 = GUICreate("Stopwatch", 170, 70);, 100, 100) \$LapsedTime = GUICtrlCreateLabel(" 00:00:00.0", 10, 10, 200, 25) GUICtrlSetTip(-1, "Lapsed time") GUICtrlSetFont(-1, 18) \$Button1 = GUICtrlCreateButton("halt/go", 10, 40, 50, 20) ; go / pause GUICtrlSetTip(-1, "Pause/Unpause counting") \$Button2 = GUICtrlCreateButton("clear", 60, 40, 50, 20) ; reset GUICtrlSetTip(-1, "Clears counter and stops") \$Button3 = GUICtrlCreateButton("restart", 110, 40, 50, 20) ; restart GUICtrlSetTip(-1, "Clears counter and restarts") GUISetState(@SW_SHOW) Stopwatch(2) ; reset to 0 and stops While 1 \$x = Int(Stopwatch() / 100) \$nMsg = GUIGetMsg() Switch \$nMsg Case \$GUI_EVENT_CLOSE Exit Case \$Button1 ; toggle status (go <-> pause) Stopwatch() ; this reads counter and sets @extended according to actual \$paused status Stopwatch(@extended) ; if is paused (@extended = 1) then unpause [Stopwatch(1)] ; if is unpaused (@extended = 0) then pause [Stopwatch(0)] Case \$Button2 ; reset to 0 and stop counter Stopwatch(2) Case \$Button3 ; reset to 0 and restart counter Stopwatch(3) EndSwitch If \$x <> Int(Stopwatch() / 100) Then \$totsec = Int(Stopwatch() / 1000) ; ms to sec \$hr = Int(\$totsec / 3600) ; hours \$mn = Int((\$totsec - (\$hr * 3600)) / 60) ; minutes \$sc = Int((\$totsec - (\$hr * 3600) - (\$mn * 60))) ; seconds \$tn = Int((Int(Stopwatch() / 100) - (\$hr * 36000) - (\$mn * 600) - (\$sc * 10))) ; tenths of a second GUICtrlSetData(\$LapsedTime, " " & StringFormat("%02s", \$hr) & ":" & StringFormat("%02s", \$mn) & ":" & StringFormat("%02s", \$sc) & "." & StringFormat("%01s", \$tn)) EndIf WEnd ; --- end of example --- ; #FUNCTION# (snippet) ========================================================================================================== ; Name...........: Stopwatch ; Description ...: returns the number of milliseconds counted (according to actions requests by caller) ; Syntax.........: Stopwatch([\$action]) ; Parameters ....: \$action: 0 - pause counting ; 1 - resume counting ; 2 - reset counter to 0 and stops ; 3 - reset counter to 0 and start counting ; 4 - (default) just ruturns actual counting value and status (status in @extended) ; ; Return values .: number of milliseconds in counter ; @extended contains paused status (1 or 0) ; 1 if stopwatch is in pause ; 0 if stopwatch is counting ; ; Author ........: Chimp ; Modified.......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: yes ; =============================================================================================================================== Func Stopwatch(\$ToggleTo = 4) Static Local \$Paused = True Static Local \$Stopwatch = 0 Static Local \$TotalTime = 0 Switch \$ToggleTo Case 0 ; pause counter If \$Paused Then SetExtended(\$Paused) ; \$Paused status Return \$TotalTime ; already paused, just return current \$TotalTime Else \$TotalTime += TimerDiff(\$Stopwatch) \$Paused = True SetExtended(\$Paused) Return \$TotalTime EndIf Case 1 ; unpause counter If \$Paused Then \$Stopwatch = TimerInit() \$Paused = False SetExtended(\$Paused) Return \$TotalTime Else SetExtended(\$Paused) Return \$TotalTime + TimerDiff(\$Stopwatch) EndIf Case 2 ; reset to 0 and pause \$Paused = True \$TotalTime = 0 SetExtended(\$Paused) Return \$TotalTime Case 3 ; reset to 0 and restart \$Paused = False \$TotalTime = 0 \$Stopwatch = TimerInit() SetExtended(\$Paused) Return \$TotalTime Case 4 ; return status SetExtended(\$Paused) If \$Paused Then Return \$TotalTime Else Return \$TotalTime + TimerDiff(\$Stopwatch) EndIf EndSwitch EndFunc ;==>Stopwatch P.S.
If you need a finished stopwatch with a nice gui and more functions, take a look to this one by AZJIO

• Hihi guys several hours messing and i still cat figure out why timer wont reset in my func.
Func shold loop untill timer difference and then it shold do other things including to reset timer as well.
Timer otself works good. after 30seconds it goes to next func. it just dosnt reset timer.
Func _Start() While 1 If TimerDiff(\$hTimer) > 30 * 1000 Then ; Wait for 10 secs \$hTimer = 0 \$hTimer = TimerInit() Sleep(100) _Image() Sleep(100) _actTimer() Sleep(100) Else MouseClick("Left", \$aPos6[0], \$aPos6[1], 1) MouseClick("Left", \$aPos4[0], \$aPos4[1], 1) MouseClick("Left", \$aPos5[0], \$aPos5[1], 1) MouseClick("Left", \$aPos7[0], \$aPos7[1], 150,0) Sleep(100) EndIf WEnd EndFunc
• By mrtgtr
I want to do something , after wait 2 min and again do same thing
But I do do not want with sleep, it must be timer
How I do this ?

• Howdy All
I've gone around and around in circles wasting hours trying to fix this problem to no avail so I thought I would try posting for help given there are some real smart people in this forum.
Background
I have 5 separate .au3 scripts that all do different basic tasks. For example:
1.au3 = opens Chrome browser to obtain information from a specific website then closes
2.au3 = opens an Excel workbook to run a macro then saves and closes
3.au3 = Open two seperate workbooks and transfers data from one to the other then saves and closes
4.au3 = .......etc
5.au3 = .......etc
These 5 separate scripts, doing completely different tasks, need to each run once per day at 5 different designated times within a day and then close. For example:
1.au3 = 10am
2.au3 = 12pm
3.au3 = 2pm
4.au3 = 4pm
5.au3 = 5pm
Problem
I can not get these different scripts to reliably run at their designated times. When I manually run these scripts individually by using 'Go F5' they work perfectly. If I convert these scripts to an .exe and manually run each one they work about 98% of time.
How can I schedule these different .au3 files or associated .exe files to reliably run each day at different times?
Attempts To Fix The Issue
1. I have tried converting each .au3 script into their own .exe file and use Window's Task Scheduler to run these .exe files at their designated time but the success rate  of running each .exe in full, to completion, without error is very low at about 30%. Things that commonly go wrong include a browser not opening but movement still continues on the desk top. Other times things just do not happen at all.
2. I have Windows 7 64 bit and have tried creating and running both (x86) and (x64) .exe files but again reliability problems exist;
3. I have also tried moving each .exe file to the My Documents folder as I read someone that keeping your files on your desktop ties your files to individual Windows user profiles which can cause AutoIt operating errors. Not sure if this is correct but thought I would try it anyway. It did not fix my issue.
4. I installed a program called AlwaysUp which supposedly always reliably runs in the background and will reliably execute your AutoIt script or .exe files. Still have significant reliability issues.
Therefore, can someone please provide advice on how I can get my 5 different .au3 files to run at 5 designated times through the day, every day, without fail? Overtime I will be creating more and more different .au3 files to run certain tasks throughout the day and do not want to create one large AutoIt file that continually runs and attempts to do all the different tasks itself.
Any help is very appreciated.
Thanks
Dan

×

• Wiki

• Back

• #### Beta

• Git
• FAQ
• Our Picks
×
• Create New...