Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
True29
Beiträge: 283 Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:
Beitrag
von True29 » 04.10.2014 23:33
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
Zuletzt geändert von
True29 am 06.10.2014 20:14, insgesamt 1-mal geändert.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Sicro
Beiträge: 955 Registriert: 11.08.2005 19:08
Kontaktdaten:
Beitrag
von Sicro » 05.10.2014 16:31
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.
True29
Beiträge: 283 Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:
Beitrag
von True29 » 06.10.2014 20:13
danke für den verbesserungsvorschlag setze ich dann auch so gerne um.
Grüße.
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283 Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:
Beitrag
von True29 » 24.05.2015 17:22
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
i7,12gb ram , Windows 10 ,Purebasic 5.50
GPI
Beiträge: 1511 Registriert: 29.08.2004 13:18
Kontaktdaten:
Beitrag
von GPI » 15.11.2015 22:32
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!
True29
Beiträge: 283 Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:
Beitrag
von True29 » 01.01.2016 01:21
danke werd ich beachten
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283 Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:
Beitrag
von True29 » 01.01.2016 03:36
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
i7,12gb ram , Windows 10 ,Purebasic 5.50
mk-soft
Beiträge: 3701 Registriert: 24.11.2004 13:12
Wohnort: Germany
Beitrag
von mk-soft » 01.01.2016 14:26
Vielleicht noch "TimerIncludeDebug" zu konstante "#TimerIncludeDebug"
und zu "CompilerIf #TimerIncludeDebug" ändern.
Dann wird es nicht mit kompiliert
True29
Beiträge: 283 Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:
Beitrag
von True29 » 10.01.2016 17:51
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
i7,12gb ram , Windows 10 ,Purebasic 5.50
Sicro
Beiträge: 955 Registriert: 11.08.2005 19:08
Kontaktdaten:
Beitrag
von Sicro » 05.05.2016 20:35
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