Jump to content

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??? 

 

Link to post
Share on other sites
  • Moderators

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

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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

 

Link to post
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 :(

Thanks for your time

Link to post
Share on other sites
  • Moderators

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 

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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

 

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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By chacoya121
      Please help calculate the secs variable i can't get it right after 60s, it go into -1 and on....
      Func CountDown() Local $count = 5 Local $newcount = $count * 60 ; 300 sec Local $time = TimerInit() While 1 Sleep(1000) Local $timediff = TimerDiff($time)/1000 ; turn into sec Local $mins= Floor(($newcount - $timediff)/60) Local $secs = Floor($newcount/$count - $timediff); Need help this line can't calculate after 60s ToolTip("Mins = " & $mins & " Secs = " & $secs) WEnd EndFunc  
    • By argumentum
      I was looking for something like this, in the forum and my HDD. Bad hair day. Anyway,
      Here is the code
      If Not StringInStr($CmdLineRaw, "/ErrorStdOut") Then Exit MsgBox(262144, @ScriptName, "...please run this example from editor.", 3) #include <Date.au3>; for _EstimatedTime() #include <InetConstants.au3>; for _EstimatedTime_Example_2() ;=============================================================================== ; ; Function Name: _EstimatedTime() ; https://www.autoitscript.com/forum/topic/177371-_estimatedtime-calculate-estimated-time-of-completion/ ; Description: calculate estimated time of completion ; Parameter(s): $a - holds the data ; $iCurrentCount - Current count ; $iTotalCount - Total count ; Requirement(s): #include <Date.au3> ; Return Value(s): false on incomplete data for assessment ; Author(s): argumentum ; Note(s): read the comments ; ;=============================================================================== Func _EstimatedTime(ByRef $a, $iCurrentCount = "", $iTotalCount = "") If $iCurrentCount & $iTotalCount = "" Then ; initialize $a = "" Dim $a[12] $a[5] = TimerInit() ; handle for TimerDiff() $a[0] = "00:00:00" $a[1] = "00:00:00" $a[2] = _NowCalc() ; starting date and time $a[3] = "" $a[4] = "0" Else If $iTotalCount = 0 Then Return False If $iCurrentCount > $iTotalCount Then $iCurrentCount = $iTotalCount _TicksToTime(Int(TimerDiff($a[5])), $a[6], $a[7], $a[8]) _TicksToTime(Int((TimerDiff($a[5]) / $iCurrentCount) * ($iTotalCount - $iCurrentCount)), $a[9], $a[10], $a[11]) $a[0] = StringFormat("%02i:%02i:%02i", $a[6], $a[7], $a[8]) ; elapsed time $a[1] = StringFormat("%02i:%02i:%02i", $a[9], $a[10], $a[11]) ; estimated total time $a[3] = _DateAdd("s", Int((TimerDiff($a[5]) / $iCurrentCount) * ($iTotalCount) / 1000), $a[2]) ; estimated date and time of completion $a[4] = Int($iCurrentCount / $iTotalCount * 100) ; percentage done EndIf Return True EndFunc ;==>_EstimatedTime _EstimatedTime_Example_1() Func _EstimatedTime_Example_1() ConsoleWrite(@CRLF & "+ Example 1" & @CRLF) ConsoleWrite("elapsed " & @TAB & "estimated" & @TAB & "starting date time " & @TAB & "estimated date time" & @CRLF) ConsoleWrite(" _NowCalc() = " & _NowCalc() & @CRLF) Local $n, $sec = @SEC, $aETTF ; "Estimated Time To Finish" data holder _EstimatedTime($aETTF) ; called with just the data holder to init. it For $n = 1234 To 1 Step -1 Sleep(1) If $sec <> @SEC Then $sec = @SEC _EstimatedTime($aETTF, 1234 - $n, 1234) ConsoleWrite($aETTF[0] & @TAB & $aETTF[1] & @TAB & $aETTF[2] & @TAB & $aETTF[3] & @TAB & $aETTF[4] & @CRLF) EndIf Next _EstimatedTime($aETTF, 1234 - $n, 1234) ConsoleWrite($aETTF[0] & @TAB & $aETTF[1] & @TAB & $aETTF[2] & @TAB & $aETTF[3] & @TAB & $aETTF[4] & @CRLF) ConsoleWrite(" _NowCalc() = " & _NowCalc() & @CRLF) EndFunc ;==>_EstimatedTime_Example_1 _EstimatedTime_Example_2() Func _EstimatedTime_Example_2() ConsoleWrite(@CRLF & "+ Example 2" & @CRLF) ConsoleWrite("elapsed " & @TAB & "estimated" & @TAB & "starting date time " & @TAB & "estimated date time" & @CRLF) ConsoleWrite(" _NowCalc() = " & _NowCalc() & @CRLF) Local $aETTF ; "Estimated Time To Finish" data holder _EstimatedTime($aETTF) ; called with just the data holder to init. it ; Save the downloaded file to the temporary folder. Local $sFilePath = @MyDocumentsDir & "\tempFile.bin" Local $sLink = "http://downloads.sourceforge.net/project/portableapps/PortableApps.com%20Platform/PortableApps.com_Platform_Setup_12.0.5.paf.exe?r=http%3A%2F%2Fsourceforge.net%2Fdirectory%2Fbusiness-enterprise%2Fos%3Awindows%2Ffreshness%3Arecently-updated%2F&ts=1442615522&use_mirror=iweb" ; Download the file in the background with the selected option of 'force a reload from the remote site.' Local $hDownload = InetGet($sLink, $sFilePath, $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND) ; Wait for the download to complete by monitoring when the 2nd index value of InetGetInfo returns True. Do Sleep(1000) If _EstimatedTime($aETTF, InetGetInfo($hDownload, $INET_DOWNLOADREAD), InetGetInfo($hDownload, $INET_DOWNLOADSIZE)) Then ConsoleWrite($aETTF[0] & @TAB & $aETTF[1] & @TAB & $aETTF[2] & @TAB & $aETTF[3] & @TAB & $aETTF[4] & @CRLF) Else ConsoleWrite(". ") EndIf Until InetGetInfo($hDownload, $INET_DOWNLOADCOMPLETE) ; Retrieve the number of total bytes received and the filesize. Local $iBytesSize = InetGetInfo($hDownload, $INET_DOWNLOADREAD) Local $iFileSize = FileGetSize($sFilePath) ; Close the handle returned by InetGet. InetClose($hDownload) _EstimatedTime($aETTF, $iBytesSize, $iFileSize) ConsoleWrite($aETTF[0] & @TAB & $aETTF[1] & @TAB & $aETTF[2] & @TAB & $aETTF[3] & @TAB & $aETTF[4] & @CRLF) ConsoleWrite(" _NowCalc() = " & _NowCalc() & @CRLF) ; Display details about the total number of bytes read and the filesize. ConsoleWrite("The total download size: " & $iBytesSize & " - The total filesize: " & $iFileSize & @CRLF) ; Delete the file. FileDelete($sFilePath) EndFunc ;==>_EstimatedTime_Example_2  
    • 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
    • By dersiniar
      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 ?
×
×
  • Create New...