Seite 1 von 1

Timer Include / PB 5.11 / All Platforms

Verfasst: 04.10.2014 23:33
von True29
Hi , hier eine einfache Include für einen Timer , kann gerne erweitert werden ;) hat so für meine Zwecke genügt.

version: 1
Platforms: Alle
PB getestet: 5.11

Funktionen:
ADD_TIMER
DELETE_TIMER
TIMER_EXIST
CHECK_TIMER

beispiel:

Code: Alles auswählen

#Timer1 = 0
#WaitTime = 5000

IncludeFile("timerinclude.pbi")

;// Existiert Timer ?
If TIMER_EXIST(#Timer1) = 0
   ;// hinzufügen
  ADD_TIMER(ElapsedMilliseconds(),#WaitTime,#Timer1)
  
ElseIf CHECK_TIMER(#Timer1)
   ;// timer abgelaufen , löschen 
  DELETE_TIMER(#Timer1)    
  
  Debug "timer ausgeführt"
EndIf
include::

Code: Alles auswählen

;****************************************************************************************************** 
;- ***  Include Timer  *** 
;****************************************************************************************************** 
;// Include Timer 
;// Johannes Meyer 
;// version 1
;// PB 5.11
;// 4.10.2014
;// forum http://www.purebasic.fr/german/viewtopic.php?f=8&t=28436
;****************************************************************************************************** 
;- ***  *** 
;****************************************************************************************************** 

Structure Struct_Timer
  StartTime.i
  Time.i
  TimerID.i
  TimeToCheck.i
EndStructure

Global NewList Timer.Struct_Timer()

Procedure ADD_TIMER(StartTime.i,TimeToCheck.i,TimerID.i = #PB_Any)
  AddElement(Timer())
  
  If TimerID = #PB_Any
  	TimerID = @Timer()
  EndIf
  
  With Timer()    
    \StartTime.i    = StartTime.i
    \TimeToCheck.i  = TimeToCheck.i
    \TimerID.i      = TimerID.i
  EndWith      
  ProcedureReturn TimerID 
  
EndProcedure

Procedure DELETE_TIMER(TimerID.i)
  
    ForEach Timer()   
      With Timer()      
        If \TimerID = TimerID   
          DeleteElement(Timer())
          ProcedureReturn #True          
        EndIf                
      EndWith    
    Next
    ProcedureReturn #False
    
EndProcedure  

Procedure TIMER_EXIST(TimerID.i)
  
   ForEach Timer()   
      With Timer()      
        If \TimerID = TimerID        
          ProcedureReturn #True
        EndIf                
      EndWith    
    Next
    
    ProcedureReturn #False    
  EndProcedure
   
Procedure CHECK_TIMER(TimerID.i)    
  Protected TimeNow.i = ElapsedMilliseconds()  
  
  ForEach Timer()   
    With Timer()
     
If \TimerID = TimerID
  If TimeNow - \StartTime >= \TimeToCheck.i
    ProcedureReturn #True
  EndIf
EndIf
      
    EndWith  
  Next  
  
ProcedureReturn #False  
EndProcedure

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 05.10.2014 16:31
von Sicro

Code: Alles auswählen

If TimeNow - \StartTime >= \TimeToCheck.i
  If \TimerID = TimerID
    ProcedureReturn #True
  EndIf
EndIf
würde ich ändern zu

Code: Alles auswählen

If \TimerID = TimerID
  If TimeNow - \StartTime >= \TimeToCheck.i
    ProcedureReturn #True
  EndIf
EndIf
If TimeNow - \StartTime >= \TimeToCheck.i
ist sicherlich langsamer als
If \TimerID = TimerID
deshalb sollte lieber das schnellere öfters geprüft werden.

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 06.10.2014 20:13
von True29
danke für den verbesserungsvorschlag setze ich dann auch so gerne um.

Grüße.

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 24.05.2015 17:22
von True29
kleines update auf 1.1
- DEBUG_TIMER() ; debug
- CONV_TIME_TO_() ;convertieren der zeit in sec, min
- GET_TIMER_TIME_PAST() ;vergangene zeit
- GET_TIMER_TIME() ;übgrige zeit
- UPDATE_TIMER() ; setzt zeit neu


kleines beispiel.

Code: Alles auswählen

#Timer2_SystemWait = 1

ADD_TIMER(ElapsedMilliseconds(),1000,#Timer2_SystemWait)  
DEBUG_TIMER()

debug GET_TIMER_TIME_PAST(#Timer2_SystemWait)

;//so hatte ich es eingesetzt.
debug LSet("",GET_TIMER_TIME_PAST(#Timer2_SystemWait)/100,".")  + CONV_TIME_TO_(GET_TIMER_TIME(#Timer2_SystemWait)

Code: Alles auswählen

;******************************************************************************************************
;- ***  Include Timer  ***
;******************************************************************************************************
;// Include Timer
;// Johannes Meyer
;// version 1.1
;// PB 5.11
;// 24.5.2015
;// forum http://www.purebasic.fr/german/viewtopic.php?f=8&t=28436
;******************************************************************************************************
;- ***  ***
;******************************************************************************************************

Structure Struct_Timer
  StartTime.i
  Time.i
  TimerID.i
  TimeToCheck.i
EndStructure

Enumeration
  #TIME_NONE
  #TIMER_SEC
  #TIMER_MIN
  #TIMER_HOURS
  #TIMER_DAY
EndEnumeration
Global NewList Timer.Struct_Timer()
Global TimerIncludeDebug.i = #False

Procedure DEBUG_TIMER(IncludeDebug = #True)
  TimerIncludeDebug = IncludeDebug
EndProcedure

Procedure UPDATE_TIMER(TimerID.i,Time.i,StartTime.i = #PB_Ignore)
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                    
        If StartTime <> #PB_Ignore
          \StartTime = StartTime
        EndIf  
        \TimeToCheck = Time
        If TimerIncludeDebug
          Debug "Timer Update ID "+ TimerID +" OK"
        EndIf
      EndIf                     
    EndWith  
  Next  
EndProcedure

Procedure CONV_TIME_TO_(time.i,Einheit.i = #TIMER_SEC)  
  Select Einheit    
    Case #TIMER_SEC
      ProcedureReturn Int(time/1000) % 60      
    Case #TIMER_MIN
      ProcedureReturn Int(time/60000) % 60      
    Case #TIMER_HOURS
      ProcedureReturn Int(time/3600000) % 24      
    Case #TIMER_DAY  
  EndSelect
        
EndProcedure

Procedure GET_TIMER_TIME_PAST(TimerID)
Protected TimeNow.i = ElapsedMilliseconds()  
  
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                                
        If TimerIncludeDebug
          Debug "Timer PAST "+TimerID+" OK"
        EndIf
        ProcedureReturn (TimeNow - \StartTime)        
      EndIf                     
    EndWith  
  Next 
  
EndProcedure

Procedure GET_TIMER_TIME(TimerID.i)
Protected TimeNow.i = ElapsedMilliseconds()  
  
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                                
        If TimerIncludeDebug
          Debug "Timer Time "+TimerID+" OK"
        EndIf
        ProcedureReturn \TimeToCheck - (TimeNow - \StartTime)
      EndIf                     
    EndWith  
  Next  
EndProcedure


Procedure ADD_TIMER(StartTime.i,TimeToCheck.i,TimerID.i = #PB_Any)
  AddElement(Timer())
  
 
  If TimerID = #PB_Any
     TimerID = @Timer()
  EndIf
 
  With Timer()   
    \StartTime.i    = StartTime.i
    \TimeToCheck.i  = TimeToCheck.i
    \TimerID.i      = TimerID.i
  EndWith     
  If TimerIncludeDebug
    Debug "Timer ADD "+TimerID+" OK"
  EndIf
        
  ProcedureReturn TimerID
 
EndProcedure

Procedure DELETE_TIMER(TimerID.i)
 
    ForEach Timer()   
      With Timer()     
        If \TimerID = TimerID   
          DeleteElement(Timer())
          If TimerIncludeDebug
            Debug "Timer DELETE "+TimerID+" OK"
          EndIf
          ProcedureReturn #True         
        EndIf               
      EndWith   
    Next
    ProcedureReturn #False
   
EndProcedure 

Procedure TIMER_EXIST(TimerID.i)
 
   ForEach Timer()   
      With Timer()     
        If \TimerID = TimerID       
          If TimerIncludeDebug
            Debug "Timer EXIST "+TimerID+" OK"
          EndIf
          ProcedureReturn #True
        EndIf               
      EndWith   
    Next
   
ProcedureReturn #False   
EndProcedure
  
  
   
  Procedure CHECK_TIMER(TimerID.i)   
    Protected TimeNow.i = ElapsedMilliseconds() 
    
    ForEach Timer()   
      With Timer()
        \Time = \TimeToCheck - (TimeNow - \StartTime)
        
        If \TimerID = TimerID
          If TimeNow - \StartTime >= \TimeToCheck.i
            If TimerIncludeDebug
              Debug "Timer CHECK "+TimerID+" OK"
            EndIf
            ProcedureReturn #True
          EndIf
        EndIf
        
      EndWith 
    Next 
    
    ProcedureReturn #False 
  EndProcedure

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 15.11.2015 22:32
von GPI
Sicro hat geschrieben:

Code: Alles auswählen

If TimeNow - \StartTime >= \TimeToCheck.i
  If \TimerID = TimerID
    ProcedureReturn #True
  EndIf
EndIf
würde ich ändern zu

Code: Alles auswählen

If \TimerID = TimerID
  If TimeNow - \StartTime >= \TimeToCheck.i
    ProcedureReturn #True
  EndIf
EndIf
If TimeNow - \StartTime >= \TimeToCheck.i
ist sicherlich langsamer als
If \TimerID = TimerID
deshalb sollte lieber das schnellere öfters geprüft werden.
Kann man Übrigens zusammenfassen:

Code: Alles auswählen

If \TimerID = TimerID AND TimeNow - \StartTime >= \TimeToCheck.i
  ProcedureReturn #True
EndIf
PB ist so schlau, das wenn die erste Hälfte des IF - And nicht erfüllt ist, die zweite gar nicht erst ausgeführt wird. Kann man auch für andere Sachen nutzen, bspw.:

Code: Alles auswählen

If *function AND CallFunctionFast(*function)>10
  ;do something
EndIf
CallFunctionFast würde hier nur aufgerufen werden, den *function<>0 ist.

So kann man sehr leicht verschachtelte IF-Endif vermeiden - die immer den Hang haben, unübersichtlich zu werden.
Das ganze ist übrigens in der Anleitung dokumentiert (zumindest die Englische) und damit sicher!

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 01.01.2016 01:21
von True29
danke werd ich beachten ;)

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 01.01.2016 03:36
von True29
kleines Update ;)

Code: Alles auswählen

;******************************************************************************************************
;- ***  Include Timer  ***
;******************************************************************************************************
;// Include Timer
;// Johannes Meyer
;// version 1.2
;// PB 5.11
;// 1.1.2016
;// forum http://www.purebasic.fr/german/viewtopic.php?f=8&t=28436
;******************************************************************************************************
;- ***  ***
;******************************************************************************************************

Structure Struct_Timer
  StartTime.i
  Time.i
  TimerID.i
  TimeToCheck.i
EndStructure

Enumeration
  #TIME_NONE
  #TIMER_SEC
  #TIMER_MIN
  #TIMER_HOURS
  #TIMER_DAY
EndEnumeration
Global NewList Timer.Struct_Timer()
Global TimerIncludeDebug.i = #False

Procedure DEBUG_TIMER(IncludeDebug = #True)
  TimerIncludeDebug = IncludeDebug
EndProcedure

Procedure UPDATE_TIMER(TimerID.i,Time.i,StartTime.i = #PB_Ignore)
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                    
        If StartTime <> #PB_Ignore
          \StartTime = StartTime
        EndIf  
        \TimeToCheck = Time
        If TimerIncludeDebug
          Debug "Timer Update ID "+ TimerID +" OK"
        EndIf
      EndIf                     
    EndWith  
  Next  
EndProcedure

Procedure CONV_TIME_TO_(time.i,Einheit.i = #TIMER_SEC)  
  Select Einheit    
    Case #TIMER_SEC
      ProcedureReturn Int(time/1000) % 60      
    Case #TIMER_MIN
      ProcedureReturn Int(time/60000) % 60      
    Case #TIMER_HOURS
      ProcedureReturn Int(time/3600000) % 24      
    Case #TIMER_DAY  
  EndSelect
  
EndProcedure

Procedure GET_TIMER_TIME_PAST(TimerID)
  Protected TimeNow.i = ElapsedMilliseconds()  
  
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                                
        If TimerIncludeDebug
          Debug "Timer PAST "+TimerID+" OK"
        EndIf
        ProcedureReturn (TimeNow - \StartTime)        
      EndIf                     
    EndWith  
  Next 
  
EndProcedure


Procedure GET_TIMER_TIME(TimerID.i)
  Protected TimeNow.i = ElapsedMilliseconds()  
  
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                                
        If TimerIncludeDebug
          Debug "Timer Time "+TimerID+" OK"
        EndIf
        ProcedureReturn \TimeToCheck - (TimeNow - \StartTime)
      EndIf                     
    EndWith  
  Next  
EndProcedure


Procedure ADD_TIMER(StartTime.i,TimeToCheck.i,TimerID.i = #PB_Any)
  AddElement(Timer())
  
  
  If TimerID = #PB_Any
    TimerID = @Timer()
  EndIf
  
  With Timer()   
    \StartTime.i    = StartTime.i
    \TimeToCheck.i  = TimeToCheck.i
    \TimerID.i      = TimerID.i
  EndWith     
  If TimerIncludeDebug
    Debug "Timer ADD "+TimerID+" OK"
  EndIf
  
  ProcedureReturn TimerID
  
EndProcedure

Procedure DELETE_TIMER(TimerID.i)
  
  ForEach Timer()   
    With Timer()     
      If \TimerID = TimerID   
        DeleteElement(Timer())
        If TimerIncludeDebug
          Debug "Timer DELETE "+TimerID+" OK"
        EndIf
        ProcedureReturn #True         
      EndIf               
    EndWith   
  Next
  ProcedureReturn #False
  
EndProcedure 

Procedure TIMER_EXIST(TimerID.i)
  
  ForEach Timer()   
    With Timer()     
      If \TimerID = TimerID       
        If TimerIncludeDebug
          Debug "Timer EXIST "+TimerID+" OK"
        EndIf
        ProcedureReturn #True
      EndIf               
    EndWith   
  Next
  
  ProcedureReturn #False   
EndProcedure

Procedure CHECK_TIMER(TimerID.i)   
  Protected TimeNow.i = ElapsedMilliseconds() 
  
  ForEach Timer()   
    With Timer()
      \Time = \TimeToCheck - (TimeNow - \StartTime)      
      If \TimerID = TimerID And TimeNow - \StartTime >= \TimeToCheck.i        
          If TimerIncludeDebug
            Debug "Timer CHECK "+TimerID+" OK"
          EndIf
          ProcedureReturn #True        
      EndIf      
    EndWith 
  Next 
  
  ProcedureReturn #False 
EndProcedure

;// RETURN COUNT OF AKTIV TIMER
Procedure COUNT_TIMER()
  Protected Timer.i
  
  ForEach Timer()
    If CHECK_TIMER(Timer()\TimerID) = #True
      Timer + 1
    EndIf    
  Next   
  
  If TimerIncludeDebug
    Debug "Timer Count " + Str(Timer)
  EndIf
          
  ProcedureReturn Timer
EndProcedure

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 01.01.2016 14:26
von mk-soft
:allright:

Vielleicht noch "TimerIncludeDebug" zu konstante "#TimerIncludeDebug"
und zu "CompilerIf #TimerIncludeDebug" ändern.
Dann wird es nicht mit kompiliert :wink:

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 10.01.2016 17:51
von True29
neue version:

changes:
- pb 5.4
- module
- debug als compilerif

Code: Alles auswählen

;******************************************************************************************************
;- ***  Include Timer  ***
;******************************************************************************************************
;// Include Timer Module
;// Johannes Meyer
;// version 1.3
;// PB 5.40
;// 1.1.2016
;// forum http://www.purebasic.fr/german/viewtopic.php?f=8&t=28436
;******************************************************************************************************
;- ***  ***
;******************************************************************************************************


DeclareModule Timer  
#TimerIncludeDebug = #False
  
Enumeration
  #TIME_NONE
  #TIMER_SEC
  #TIMER_MIN
  #TIMER_HOURS
  #TIMER_DAY
EndEnumeration
  
  Declare UPDATE_TIMER(TimerID.i,Time.i,StartTime.i = #PB_Ignore)
  Declare CONV_TIME_TO_(time.i,Einheit.i = #TIMER_SEC)
  Declare GET_TIMER_TIME_PAST(TimerID)
  Declare GET_TIMER_TIME(TimerID)
  Declare ADD_TIMER(StartTime.i,TimeToCheck.i,TimerID.i = #PB_Any)
  Declare DELETE_TIMER(TimerID)
  Declare TIMER_EXIST(TimerID)
  Declare CHECK_TIMER(TimerID)
  Declare COUNT_TIMER()
EndDeclareModule


Module Timer
 

Structure Struct_Timer
  StartTime.i
  Time.i
  TimerID.i
  TimeToCheck.i
EndStructure

Global NewList Timer.Struct_Timer()
Global TimerIncludeDebug.i = #False

Procedure UPDATE_TIMER(TimerID.i,Time.i,StartTime.i = #PB_Ignore)
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                    
        If StartTime <> #PB_Ignore
          \StartTime = StartTime
        EndIf  
        \TimeToCheck = Time
        
        CompilerIf #TimerIncludeDebug
          Debug "Timer Update ID "+ TimerID +" OK"
        CompilerEndIf
        
      EndIf                     
    EndWith  
  Next  
EndProcedure

Procedure CONV_TIME_TO_(time.i,Einheit.i = #TIMER_SEC)  
  Select Einheit    
    Case #TIMER_SEC
      ProcedureReturn Int(time/1000) % 60      
    Case #TIMER_MIN
      ProcedureReturn Int(time/60000) % 60      
    Case #TIMER_HOURS
      ProcedureReturn Int(time/3600000) % 24      
    Case #TIMER_DAY  
  EndSelect
  
EndProcedure

Procedure GET_TIMER_TIME_PAST(TimerID)
  Protected TimeNow.i = ElapsedMilliseconds()  
  
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                                
        CompilerIf #TimerIncludeDebug
          Debug "Timer PAST "+TimerID+" OK"
        CompilerEndIf
        ProcedureReturn (TimeNow - \StartTime)        
      EndIf                     
    EndWith  
  Next 
  
EndProcedure


Procedure GET_TIMER_TIME(TimerID.i)
  Protected TimeNow.i = ElapsedMilliseconds()  
  
  ForEach Timer()   
    With Timer()
      If TimerID = \TimerID                                
        CompilerIf #TimerIncludeDebug
          Debug "Timer Time "+TimerID+" OK"
        CompilerEndIf
        ProcedureReturn \TimeToCheck - (TimeNow - \StartTime)
      EndIf                     
    EndWith  
  Next  
EndProcedure


Procedure ADD_TIMER(StartTime.i,TimeToCheck.i,TimerID.i = #PB_Any)
  AddElement(Timer())
  
  
  If TimerID = #PB_Any
    TimerID = @Timer()
  EndIf
  
  With Timer()   
    \StartTime.i    = StartTime.i
    \TimeToCheck.i  = TimeToCheck.i
    \TimerID.i      = TimerID.i
  EndWith     
  CompilerIf #TimerIncludeDebug
    Debug "Timer ADD "+TimerID+" OK"
  CompilerEndIf
  
  ProcedureReturn TimerID
  
EndProcedure

Procedure DELETE_TIMER(TimerID.i)
  
  ForEach Timer()   
    With Timer()     
      If \TimerID = TimerID   
        DeleteElement(Timer())
        CompilerIf #TimerIncludeDebug
          Debug "Timer DELETE "+TimerID+" OK"
        CompilerEndIf
        ProcedureReturn #True         
      EndIf               
    EndWith   
  Next
  ProcedureReturn #False
  
EndProcedure 

Procedure TIMER_EXIST(TimerID.i)
  
  ForEach Timer()   
    With Timer()     
      If \TimerID = TimerID       
        CompilerIf #TimerIncludeDebug
          Debug "Timer EXIST "+TimerID+" OK"
        CompilerEndIf
        ProcedureReturn #True
      EndIf               
    EndWith   
  Next
  
  ProcedureReturn #False   
EndProcedure

Procedure CHECK_TIMER(TimerID.i)   
  Protected TimeNow.i = ElapsedMilliseconds() 
  
  ForEach Timer()   
    With Timer()
      \Time = \TimeToCheck - (TimeNow - \StartTime)      
      If \TimerID = TimerID And TimeNow - \StartTime >= \TimeToCheck.i        
          CompilerIf #TimerIncludeDebug
            Debug "Timer CHECK "+TimerID+" OK"
          CompilerEndIf
          ProcedureReturn #True        
      EndIf      
    EndWith 
  Next 
  
  ProcedureReturn #False 
EndProcedure

;// RETURN COUNT OF AKTIV TIMER
Procedure COUNT_TIMER()
  Protected Timer.i
  
  ForEach Timer()
    If CHECK_TIMER(Timer()\TimerID) = #True
      Timer + 1
    EndIf    
  Next   
  
  CompilerIf #TimerIncludeDebug
    Debug "Timer Count " + Str(Timer)
  CompilerEndIf
          
  ProcedureReturn Timer
EndProcedure

EndModule

Beispiel

Code: Alles auswählen

#Timer1 = 0
#WaitTime = 5000

IncludeFile("timerinclude.pbi")

;// Existiert Timer ?

If Timer::TIMER_EXIST(#Timer1) = 0
   ;// hinzufügen
  Timer::ADD_TIMER(ElapsedMilliseconds(),#WaitTime,#Timer1) 
ElseIf Timer::CHECK_TIMER(#Timer1)
   ;// timer abgelaufen , löschen
  Timer::DELETE_TIMER(#Timer1)   
 
  Debug "timer ausgeführt"
EndIf

Re: Timer Include / PB 5.11 / All Platforms

Verfasst: 05.05.2016 20:35
von Sicro
Der Code im CodeArchiv unter Time_and_Date/SimpleTimer.pbi wird durch diese verbesserte Version ersetzt:

Code: Alles auswählen

EnableExplicit

DeclareModule Timer
  EnableExplicit
  
  #TimerIncludeDebug = #False
  
  Enumeration
    #TIMER_SEC
    #TIMER_MIN
    #TIMER_HOUR
    #TIMER_DAY
  EndEnumeration
  
  Declare.i UPDATE_TIMER(TimerID.i, Time.i, StartTime.i = #PB_Ignore)
  Declare.i CONV_TIME_TO_(Time.i, Type.i = #TIMER_SEC)
  Declare.i GET_TIMER_TIME_PAST(TimerID.i)
  Declare.i GET_TIMER_TIME(TimerID.i)
  Declare.i ADD_TIMER(StartTime.i, TimeToCheck.i, TimerID.i = #PB_Any)
  Declare.i DELETE_TIMER(TimerID.i)
  Declare.i TIMER_EXIST(TimerID.i)
  Declare.i CHECK_TIMER(TimerID.i)
  Declare.i COUNT_TIMER()
EndDeclareModule

Module Timer
    
  Structure Struct_Timer
    StartTime.i
    Time.i
    TimerID.i
    TimeToCheck.i
  EndStructure
  
  Global NewList Timer.Struct_Timer()
  Global TimerIncludeDebug.i = #False
  
  Procedure.i UPDATE_TIMER(TimerID.i, Time.i, StartTime.i = #PB_Ignore)
    ForEach Timer()
      With Timer()
        If TimerID = \TimerID
          If StartTime <> #PB_Ignore
            \StartTime = StartTime
          EndIf
          \TimeToCheck = Time
          
          CompilerIf #TimerIncludeDebug
            Debug "Timer Update ID "+ TimerID +" OK"
          CompilerEndIf
          
        EndIf
      EndWith
    Next
  EndProcedure
  
  Procedure.i CONV_TIME_TO_(Time.i, Type.i = #TIMER_SEC)
    Select Type
      Case #TIMER_SEC
        ProcedureReturn (Time / 1000) % 60     
      Case #TIMER_MIN
        ProcedureReturn (Time / 60000) % 60     
      Case #TIMER_HOUR
        ProcedureReturn (Time / 3600000) % 24     
      Case #TIMER_DAY
        ProcedureReturn Time / 86400000
    EndSelect
  EndProcedure
  
  Procedure.i GET_TIMER_TIME_PAST(TimerID.i)
    Protected TimeNow.i = ElapsedMilliseconds()
    
    ForEach Timer()
      With Timer()
        If TimerID = \TimerID
          CompilerIf #TimerIncludeDebug
            Debug "Timer PAST "+TimerID+" OK"
          CompilerEndIf
          ProcedureReturn (TimeNow - \StartTime)
        EndIf
      EndWith
    Next
  EndProcedure
    
  Procedure.i GET_TIMER_TIME(TimerID.i)
    Protected TimeNow.i = ElapsedMilliseconds()
    
    ForEach Timer()
      With Timer()
        If TimerID = \TimerID
          CompilerIf #TimerIncludeDebug
            Debug "Timer Time "+TimerID+" OK"
          CompilerEndIf
          ProcedureReturn \TimeToCheck - (TimeNow - \StartTime)
        EndIf
      EndWith
    Next
  EndProcedure
    
  Procedure.i ADD_TIMER(StartTime.i, TimeToCheck.i, TimerID.i = #PB_Any)
    AddElement(Timer())
        
    If TimerID = #PB_Any
      TimerID = @Timer()
    EndIf
    
    With Timer()
      \StartTime   = StartTime
      \TimeToCheck = TimeToCheck
      \TimerID     = TimerID
    EndWith
    CompilerIf #TimerIncludeDebug
      Debug "Timer ADD "+TimerID+" OK"
    CompilerEndIf
    
    ProcedureReturn TimerID
  EndProcedure
  
  Procedure.i DELETE_TIMER(TimerID.i)
    ForEach Timer()
      With Timer()
        If \TimerID = TimerID
          DeleteElement(Timer())
          CompilerIf #TimerIncludeDebug
            Debug "Timer DELETE "+TimerID+" OK"
          CompilerEndIf
          ProcedureReturn #True
        EndIf
      EndWith
    Next
    ProcedureReturn #False
  EndProcedure
  
  Procedure.i TIMER_EXIST(TimerID.i)
    ForEach Timer()
      With Timer()
        If \TimerID = TimerID
          CompilerIf #TimerIncludeDebug
            Debug "Timer EXIST "+TimerID+" OK"
          CompilerEndIf
          ProcedureReturn #True
        EndIf
      EndWith
    Next
    
    ProcedureReturn #False
  EndProcedure
  
  Procedure.i CHECK_TIMER(TimerID.i)
    Protected TimeNow.i = ElapsedMilliseconds()
    
    ForEach Timer()
      With Timer()
        \Time = \TimeToCheck - (TimeNow - \StartTime)
        If \TimerID = TimerID And TimeNow - \StartTime >= \TimeToCheck
          CompilerIf #TimerIncludeDebug
            Debug "Timer CHECK "+TimerID+" OK"
          CompilerEndIf
          ProcedureReturn #True
        EndIf
      EndWith
    Next
    
    ProcedureReturn #False
  EndProcedure
  
  Procedure.i COUNT_TIMER()
    Protected Timer.i
    
    ForEach Timer()
      If CHECK_TIMER(Timer()\TimerID) = #True
        Timer + 1
      EndIf
    Next
    
    CompilerIf #TimerIncludeDebug
      Debug "Timer Count " + Str(Timer)
    CompilerEndIf
    
    ProcedureReturn Timer
  EndProcedure
  
EndModule

;-Example
CompilerIf #PB_Compiler_IsMainFile
  #Timer1 = 0
  #WaitTime = 5000
  
  Timer::ADD_TIMER(ElapsedMilliseconds(), #WaitTime, #Timer1)
  
  Repeat
    If Timer::CHECK_TIMER(#Timer1)
      Debug Str(#WaitTime)+" milliseconds have expired!"
      Timer::DELETE_TIMER(#Timer1)
      Break
    EndIf
  ForEver
CompilerEndIf