Timer Include / PB 5.11 / All Platforms

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:

Timer Include / PB 5.11 / All Platforms

Beitrag 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
Zuletzt geändert von True29 am 06.10.2014 20:14, insgesamt 1-mal geändert.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Timer Include / PB 5.11 / All Platforms

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Timer Include / PB 5.11 / All Platforms

Beitrag von True29 »

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:

Re: Timer Include / PB 5.11 / All Platforms

Beitrag 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
i7,12gb ram , Windows 10 ,Purebasic 5.50
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Timer Include / PB 5.11 / All Platforms

Beitrag 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!
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Timer Include / PB 5.11 / All Platforms

Beitrag von True29 »

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:

Re: Timer Include / PB 5.11 / All Platforms

Beitrag 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
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Timer Include / PB 5.11 / All Platforms

Beitrag von mk-soft »

:allright:

Vielleicht noch "TimerIncludeDebug" zu konstante "#TimerIncludeDebug"
und zu "CompilerIf #TimerIncludeDebug" ändern.
Dann wird es nicht mit kompiliert :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Timer Include / PB 5.11 / All Platforms

Beitrag 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
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Timer Include / PB 5.11 / All Platforms

Beitrag 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
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten