Page 1 of 1

Chronometer - Temporizer V1.0.3 - Updated to V2.0.0

Posted: Mon Jan 02, 2006 5:17 am
by Guimauve
A very simple Chronometer - Temporizer

it's a Based Object Programming (BOP) exemple.
Sorry all comment and Message are in French.

Regards
Guimauve

Update V1.0.3

I have added some command.
Also the exemple is a demonstration of a self-correcting temporized procedure.

The Mask$ for the command FormatMilliseconds(Masque$, MilliSeconds) is similar to FormatDate() PB Command. To ajust milliseconds use %mss to see 0.000 seconds and %ms to see 0.00 seconds.

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Exemple - Chronomètre - Temporisateur
; Fichier : Code de démonstration
; Version : 1.0.3
; Programmation = OK
; Programmé par : Guimauve
; Date : 31-12-2005
; Mise à jour : 03-01-2006
; Codé avec PureBasic V3.94
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure >>>>>

Structure Chronometer
   
   StartTime.l
   TotalTime.l
   Running.b
   
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Description :
;
; Cette librairie permet de créer des Chronomètres
; et des Temporisateurs de haute précision. 
;
; Temps maximal de mémorisation : capacité d'un 
; entier (long) de 4 octets ou 32 bits
;
; soit 2 147 483 647 millisecondes
; ou soit environ 2 147 483 secondes
; ou soit environ 35 791 minutes
; ou soit environ 596 heures
; ou soit environ 24 jours
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs >>>>>

ProcedureDLL SetChronometerStartTime(*ChronoA.Chronometer, StartTime.l)
   
   *ChronoA\StartTime = StartTime
   
EndProcedure

ProcedureDLL SetChronometerTotalTime(*ChronoA.Chronometer, TotalTime.l)
   
   *ChronoA\TotalTime = TotalTime
   
EndProcedure

ProcedureDLL SetChronometerRunning(*ChronoA.Chronometer, Running.b)
   
   *ChronoA\Running = Running
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs >>>>>

ProcedureDLL.l GetChronometerStartTime(*ChronoA.Chronometer)
   
   ProcedureReturn *ChronoA\StartTime
   
EndProcedure

ProcedureDLL.l GetChronometerTotalTime(*ChronoA.Chronometer)
   
   ProcedureReturn *ChronoA\TotalTime
   
EndProcedure

ProcedureDLL.b GetChronometerRunning(*ChronoA.Chronometer)
   
   ProcedureReturn *ChronoA\Running
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Equal >>>>>

ProcedureDLL EqualChronometer(*ChronoA.Chronometer, *ChronoB.Chronometer)
   
   SetChronometerStartTime(*ChronoA, GetChronometerStartTime(*ChronoB))
   SetChronometerTotalTime(*ChronoA, GetChronometerTotalTime(*ChronoB))
   SetChronometerRunning(*ChronoA, GetChronometerRunning(*ChronoB))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Compare >>>>>

ProcedureDLL.b CompareChronometer(*ChronoA.Chronometer, *ChronoB.Chronometer)
   
   Compare.b = #False
   
   If GetChronometerStartTime(*ChronoA) <> GetChronometerStartTime(*ChronoB)
      Compare = #True
   EndIf
   
   If GetChronometerTotalTime(*ChronoA) <> GetChronometerTotalTime(*ChronoB)
      Compare = #True
   EndIf
   
   If GetChronometerRunning(*ChronoA) <> GetChronometerRunning(*ChronoB)
      Compare = #True
   EndIf
   
   ProcedureReturn Compare
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset >>>>>

ProcedureDLL ResetChronometer(*ChronoA.Chronometer)
   
   SetChronometerStartTime(*ChronoA, 0)
   SetChronometerTotalTime(*ChronoA, 0)
   SetChronometerRunning(*ChronoA, 0)
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Lecture fichier Binaire >>>>>

ProcedureDLL ReadChronometer(*ChronoA.Chronometer)
   
   SetChronometerStartTime(*ChronoA, ReadLong())
   SetChronometerTotalTime(*ChronoA, ReadLong())
   SetChronometerRunning(*ChronoA, ReadByte())
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Écriture fichier Binaire >>>>>

ProcedureDLL WriteChronometer(*ChronoA.Chronometer)
   
   WriteLong(GetChronometerStartTime(*ChronoA))
   WriteLong(GetChronometerTotalTime(*ChronoA))
   WriteByte(GetChronometerRunning(*ChronoA))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 32 ms <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démmarer Chronometer <<<<<

ProcedureDLL StartChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #False
      
      SetChronometerStartTime(*ChronoA, ElapsedMilliseconds())
      SetChronometerRunning(*ChronoA, #True)
      
   EndIf
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter Chronometer <<<<<

ProcedureDLL StopChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      SetChronometerTotalTime(*ChronoA, GetChronometerTotalTime(*ChronoA) + ElapsedMilliseconds() - GetChronometerStartTime(*ChronoA))
      SetChronometerRunning(*ChronoA, #False)
      
   EndIf 
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter Chronometer <<<<<

ProcedureDLL.l ConsultChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      TotalTime.l = GetChronometerTotalTime(*ChronoA) + ElapsedMilliseconds() - GetChronometerStartTime(*ChronoA)
      
   Else
      
      TotalTime = GetChronometerTotalTime(*ChronoA)
      
   EndIf 
   
   ProcedureReturn TotalTime
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des secondes en MS <<<<<

ProcedureDLL.l SecondsToMilliseconds(Seconds.l)
   
   ProcedureReturn Seconds * 1000
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des minutes en MS <<<<<

ProcedureDLL.l MinutesToMilliseconds(Minutes.l)
   
   ProcedureReturn SecondsToMilliseconds(Minutes * 60)
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des heures en MS <<<<<

ProcedureDLL.l HoursToMilliseconds(Hours.l)
   
   ProcedureReturn MinutesToMilliseconds(Hours * 60)
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des Jours en MS <<<<<

ProcedureDLL.l DaysToMilliseconds(Days.l)
   
   ProcedureReturn HoursToMilliseconds(Days * 24)
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajuster le temps du Temporizer <<<<<

ProcedureDLL SetTemporizerTotalTime(*ChronoA.Chronometer, MilliSeconds.l)
   
   SetChronometerTotalTime(*ChronoA, MilliSeconds)
   
EndProcedure 

ProcedureDLL SetTemporizerTotalTime2(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l)
   
   TotalTime.l = MilliSeconds + SecondsToMilliseconds(Seconds)
   
   SetChronometerTotalTime(*ChronoA, TotalTime)
   
EndProcedure 

ProcedureDLL SetTemporizerTotalTime3(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l, Minutes.l)
   
   TotalTime.l = MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes)
   
   SetChronometerTotalTime(*ChronoA, TotalTime)
   
EndProcedure 

ProcedureDLL SetTemporizerTotalTime4(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l, Minutes.l, Hours.l)
   
   TotalTime.l = MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes)
   TotalTime + HoursToMilliseconds(Hours)
   SetChronometerTotalTime(*ChronoA, TotalTime)
   
EndProcedure 

ProcedureDLL SetTemporizerTotalTime5(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l, Minutes.l, Hours.l, Days.l)
   
   TotalTime.l = MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes)
   TotalTime + HoursToMilliseconds(Hours) + DaysToMilliseconds(Days)
   SetChronometerTotalTime(*ChronoA, TotalTime)
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démmarer Temporisateur <<<<<

ProcedureDLL StartTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #False
      
      SetChronometerStartTime(*ChronoA, ElapsedMilliseconds())
      SetChronometerRunning(*ChronoA, #True)
      
   EndIf
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter le Temporisateur <<<<<

ProcedureDLL StopTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      SetChronometerTotalTime(*ChronoA, GetChronometerTotalTime(*ChronoA) - ElapsedMilliseconds() + GetChronometerStartTime(*ChronoA))
      SetChronometerRunning(*ChronoA, #False)
      
   EndIf 
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter le Temporisateur <<<<<

ProcedureDLL.l ConsultTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      TotalTime.l = GetChronometerTotalTime(*ChronoA) - ElapsedMilliseconds() + GetChronometerStartTime(*ChronoA)
      
   Else
      
      TotalTime = GetChronometerTotalTime(*ChronoA)
      
   EndIf 
   
   ProcedureReturn TotalTime
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Conversion de milliseconde vers en j : H : M : S : Ms <<<<<

ProcedureDLL.s FormatMilliseconds(Masque$, MilliSeconds)
   
   ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   ; <<<<< On fait l'extraction des jours, Heures, minutes, secondes et des MS <<<<<
   
   Days = MilliSeconds / 86400000 
   MilliSeconds % 86400000
   
   Hours = MilliSeconds / 3600000
   MilliSeconds % 3600000
   
   Minutes = MilliSeconds / 60000
   MilliSeconds % 60000
   
   Seconds = MilliSeconds / 1000
   MilliSeconds % 1000
   
   ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   ; <<<<< On s'occupe du filtre de sortie <<<<<
   
   If FindString(Masque$, "%dd", 1)
      
      Masque$ = ReplaceString(Masque$,"%dd", RSet(Str(Days), 2, "0"))
      
   EndIf 
   
   If FindString(Masque$, "%hh", 1)
      
      Masque$ = ReplaceString(Masque$,"%hh", RSet(Str(Hours), 2, "0"))
      
   EndIf 
   
   If FindString(Masque$, "%mm", 1)
      
      Masque$ = ReplaceString(Masque$,"%mm", RSet(Str(Minutes), 2, "0"))
      
   EndIf 
   
   If FindString(Masque$, "%ss", 1)
      
      Masque$ = ReplaceString(Masque$,"%ss", RSet(Str(Seconds), 2, "0"))
      
   EndIf 
   
   If FindString(Masque$, "%mss", 1)
      
      Masque$ = ReplaceString(Masque$,"%mss", RSet(Str(MilliSeconds), 3, "0"))
      
   EndIf
   
   If FindString(Masque$, "%ms", 1)
      
      Masque$ = ReplaceString(Masque$,"%ms", RSet(Str(MilliSeconds), 2, "0"))
      
   EndIf 
   
   ProcedureReturn Masque$
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver le nombre de Millisecondes <<<<<

ProcedureDLL CalculateMilliseconds(MilliSeconds.l, Seconds.l)
   
   ProcedureReturn MilliSeconds + SecondsToMilliseconds(Seconds)
   
EndProcedure 

ProcedureDLL CalculateMilliseconds2(MilliSeconds.l, Seconds.l, Minutes.l)
   
   ProcedureReturn MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes)
   
EndProcedure 

ProcedureDLL CalculateMilliseconds3(MilliSeconds.l, Seconds.l, Minutes.l, Hours.l)
   
   ProcedureReturn MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes) + HoursToMilliseconds(Hours)
   
EndProcedure 

ProcedureDLL CalculateMilliseconds4(MilliSeconds.l, Seconds.l, Minutes.l, Hours.l, Days.l)
   
   ProcedureReturn MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes) + HoursToMilliseconds(Hours) + DaysToMilliseconds(Days)
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<< FIN DU FICHIER <<<<
; <<<<<<<<<<<<<<<<<<<<<<<<

#Nombre_de_test = 5

Dim Message.s(#Nombre_de_test)

Message(0) = "On se prépare à Temporiser : "
Message(1) = "1ere"
Message(2) = "2e"
Message(3) = "3e"
Message(4) = "4e"
Message(5) = "5e et dernière"


Procedure FaireQuelqueChose(No_Test)
   
   Static Temp_de_surtempo
   
   ; Ici on calcule le temps de temporisation et on ajoute le temps de 
   ; surtemporisation (négatif) de l'appel précédent de la procedure.  
   ; De cette façon la temporisation se corrige toute seule.
   
   Temps_de_Tempo = 1562 + Temp_de_surtempo
   
   
   SetTemporizerTotalTime(Beta.Chronometer,Temps_de_Tempo)
   
   MessageRequester("Test Chronometer - Temporizer", Message(0) + Str(Temps_de_Tempo))
   
   StartChronometer(Alpha.Chronometer)
   StartTemporizer(Beta.Chronometer)
   
   Repeat 
      
      ; Si la consultation du temporisateur est plus petite ou égale à 0
      ; on stop le Chronomètre, le temporisateur et finalement on ajuste 
      ; la condition pour sortir de la boucle Repeat - Until.
      
      If ConsultTemporizer(Beta) <= 0
         StopChronometer(Alpha)
         StopTemporizer(Beta)
         exit = #True
      EndIf 
      
   Until exit = #True
   
   Temp_de_surtempo = ConsultTemporizer(Beta)
   MessageRequester(Message(No_Test) + " Lecture du Chronomètre", "Temps cumulé dans le chonomètre = " + FormatMilliseconds("%mm : %ss : %mss", ConsultChronometer(Alpha)))
   MessageRequester(Message(No_Test) + " Lecture du Temporisateur", "Temps de débordement du temporisateur = " + FormatMilliseconds("%mm : %ss : %mss", Temp_de_surtempo))
   
EndProcedure 

For test = 1 To #Nombre_de_test
   
   FaireQuelqueChose(test)
   
Next 

End


Posted: Tue Jan 03, 2006 9:33 pm
by Guimauve
I just post this message. Updated Code

Regards
Guimauve

Posted: Sun Feb 05, 2006 3:40 am
by Guimauve
Updated Version for PB V4.00

Some commands have an commented instruction. These instructions probably work much faster. So feel free to edit them.

Regards

Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : Chronometer and Temporizer
; File : Library
; File Version : 1.1.3
; Programmation : OK
; Programmed by : Guimauve
; Date : 31-12-2005
; Last Update : 04-02-2006
; Coded for PureBasic V4.00
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure definition >>>>>

Structure Chronometer
   
   StartTime.l
   TotalTime.l
   Running.b
   
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Description :
;
; Cette librairie permet de créer des Chronomètres
; et des Temporisateurs de haute précision.
;
; Temps maximal de mémorisation : capacité d'un
; entier (long) de 4 octets ou 32 bits
;
; soit 2 147 483 647 millisecondes
; ou soit environ 2 147 483 secondes
; ou soit environ 35 791 minutes
; ou soit environ 596 heures
; ou soit environ 24 jours
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<
; <<<<< Mutators >>>>>

ProcedureDLL SetChronometerStartTime(*ChronoA.Chronometer, StartTime.l)
   
   *ChronoA\StartTime = StartTime
   
EndProcedure

ProcedureDLL SetChronometerTotalTime(*ChronoA.Chronometer, TotalTime.l)
   
   *ChronoA\TotalTime = TotalTime
   
EndProcedure

ProcedureDLL SetChronometerRunning(*ChronoA.Chronometer, Running.b)
   
   *ChronoA\Running = Running
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Observators >>>>>

ProcedureDLL.l GetChronometerStartTime(*ChronoA.Chronometer)
   
   ProcedureReturn *ChronoA\StartTime
   
EndProcedure

ProcedureDLL.l GetChronometerTotalTime(*ChronoA.Chronometer)
   
   ProcedureReturn *ChronoA\TotalTime
   
EndProcedure

ProcedureDLL.b GetChronometerRunning(*ChronoA.Chronometer)
   
   ProcedureReturn *ChronoA\Running
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Equal operator >>>>>

ProcedureDLL EqualChronometer(*ChronoA.Chronometer, *ChronoB.Chronometer)
   
   SetChronometerStartTime(*ChronoA, GetChronometerStartTime(*ChronoB))
   SetChronometerTotalTime(*ChronoA, GetChronometerTotalTime(*ChronoB))
   SetChronometerRunning(*ChronoA, GetChronometerRunning(*ChronoB))
   
   ; CopyMemory(*ChronoB, *ChronoA, SizeOf(Chronometer))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Compare operator >>>>>

ProcedureDLL.b CompareChronometer(*ChronoA.Chronometer, *ChronoB.Chronometer)
   
   Compare.b = #True
   
   If GetChronometerStartTime(*ChronoA) <> GetChronometerStartTime(*ChronoB)
      Compare = #False
   EndIf
   
   If GetChronometerTotalTime(*ChronoA) <> GetChronometerTotalTime(*ChronoB)
      Compare = #False
   EndIf
   
   If GetChronometerRunning(*ChronoA) <> GetChronometerRunning(*ChronoB)
      Compare = #False
   EndIf
   
   ProcedureReturn Compare
   
   ; ProcedureReturn CompareMemory(*ChronoA, *ChronoB, SizeOf(Chronometer))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Reset operators >>>>>

ProcedureDLL ResetChronometer(*ChronoA.Chronometer)
   
   SetChronometerStartTime(*ChronoA, 0)
   SetChronometerTotalTime(*ChronoA, 0)
   SetChronometerRunning(*ChronoA, 0)
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Read Binary file >>>>>

ProcedureDLL ReadChronometer(FileID,*ChronoA.Chronometer)
   
   SetChronometerStartTime(*ChronoA, ReadLong(FileID))
   SetChronometerTotalTime(*ChronoA, ReadLong(FileID))
   SetChronometerRunning(*ChronoA, ReadByte(FileID))
   
   ; ReadData(FileID, *ChronoA, SizeOf(Chronometer))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Write Binary file >>>>>

ProcedureDLL WriteChronometer(FileID.l, *ChronoA.Chronometer)
   
   WriteLong(FileID, GetChronometerStartTime(*ChronoA))
   WriteLong(FileID, GetChronometerTotalTime(*ChronoA))
   WriteByte(FileID, GetChronometerRunning(*ChronoA))
   
   ; WriteData(FileID, *ChronoA, SizeOf(Chronometer))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in :  32 ms <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Start Chronometer <<<<<

ProcedureDLL StartChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #False
      
      SetChronometerStartTime(*ChronoA, ElapsedMilliseconds())
      SetChronometerRunning(*ChronoA, #True)
      
   EndIf
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Stop Chronometer <<<<<

ProcedureDLL StopChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      SetChronometerTotalTime(*ChronoA, GetChronometerTotalTime(*ChronoA) + ElapsedMilliseconds() - GetChronometerStartTime(*ChronoA))
      SetChronometerRunning(*ChronoA, #False)
      
   EndIf
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consult Chronometer <<<<<

ProcedureDLL.l ConsultChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      TotalTime.l = GetChronometerTotalTime(*ChronoA) + ElapsedMilliseconds() - GetChronometerStartTime(*ChronoA)
      
   Else
      
      TotalTime = GetChronometerTotalTime(*ChronoA)
      
   EndIf
   
   ProcedureReturn TotalTime
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des secondes en MS <<<<<

ProcedureDLL.l SecondsToMilliseconds(Seconds.l)
   
   ProcedureReturn Seconds * 1000
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des minutes en MS <<<<<

ProcedureDLL.l MinutesToMilliseconds(Minutes.l)
   
   ProcedureReturn SecondsToMilliseconds(Minutes * 60)
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des heures en MS <<<<<

ProcedureDLL.l HoursToMilliseconds(Hours.l)
   
   ProcedureReturn MinutesToMilliseconds(Hours * 60)
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des Jours en MS <<<<<

ProcedureDLL.l DaysToMilliseconds(Days.l)
   
   ProcedureReturn HoursToMilliseconds(Days * 24)
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajuster le temps du Temporizer <<<<<

ProcedureDLL SetTemporizerTotalTime(*ChronoA.Chronometer, MilliSeconds.l)
   
   SetChronometerTotalTime(*ChronoA, MilliSeconds)
   
EndProcedure

ProcedureDLL SetTemporizerTotalTime2(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l)
   
   TotalTime.l = MilliSeconds + SecondsToMilliseconds(Seconds)
   
   SetChronometerTotalTime(*ChronoA, TotalTime)
   
EndProcedure

ProcedureDLL SetTemporizerTotalTime3(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l, Minutes.l)
   
   TotalTime.l = MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes)
   
   SetChronometerTotalTime(*ChronoA, TotalTime)
   
EndProcedure

ProcedureDLL SetTemporizerTotalTime4(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l, Minutes.l, Hours.l)
   
   TotalTime.l = MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes)
   TotalTime + HoursToMilliseconds(Hours)
   SetChronometerTotalTime(*ChronoA, TotalTime)
   
EndProcedure

ProcedureDLL SetTemporizerTotalTime5(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l, Minutes.l, Hours.l, Days.l)
   
   TotalTime.l = MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes)
   TotalTime + HoursToMilliseconds(Hours) + DaysToMilliseconds(Days)
   SetChronometerTotalTime(*ChronoA, TotalTime)
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démmarer Temporisateur <<<<<

ProcedureDLL StartTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #False
      
      SetChronometerStartTime(*ChronoA, ElapsedMilliseconds())
      SetChronometerRunning(*ChronoA, #True)
      
   EndIf
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter le Temporisateur <<<<<

ProcedureDLL StopTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      SetChronometerTotalTime(*ChronoA, GetChronometerTotalTime(*ChronoA) - ElapsedMilliseconds() + GetChronometerStartTime(*ChronoA))
      SetChronometerRunning(*ChronoA, #False)
      
   EndIf
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter le Temporisateur <<<<<

ProcedureDLL.l ConsultTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      TotalTime.l = GetChronometerTotalTime(*ChronoA) - ElapsedMilliseconds() + GetChronometerStartTime(*ChronoA)
      
   Else
      
      TotalTime = GetChronometerTotalTime(*ChronoA)
      
   EndIf
   
   ProcedureReturn TotalTime
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Conversion de milliseconde vers en j : H : M : S : Ms <<<<<

ProcedureDLL.s FormatMilliseconds(Masque$, MilliSeconds)
   
   ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   ; <<<<< On fait l'extraction des jours, Heures, minutes, secondes et des MS <<<<<
   
   Days = MilliSeconds / 86400000
   MilliSeconds % 86400000
   
   Hours = MilliSeconds / 3600000
   MilliSeconds % 3600000
   
   Minutes = MilliSeconds / 60000
   MilliSeconds % 60000
   
   Seconds = MilliSeconds / 1000
   MilliSeconds % 1000
   
   ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   ; <<<<< On s'occupe du filtre de sortie <<<<<
   
   If FindString(Masque$, "%dd", 1)
      
      Masque$ = ReplaceString(Masque$,"%dd", RSet(Str(Days), 2, "0"))
      
   EndIf
   
   If FindString(Masque$, "%hh", 1)
      
      Masque$ = ReplaceString(Masque$,"%hh", RSet(Str(Hours), 2, "0"))
      
   EndIf
   
   If FindString(Masque$, "%mm", 1)
      
      Masque$ = ReplaceString(Masque$,"%mm", RSet(Str(Minutes), 2, "0"))
      
   EndIf
   
   If FindString(Masque$, "%ss", 1)
      
      Masque$ = ReplaceString(Masque$,"%ss", RSet(Str(Seconds), 2, "0"))
      
   EndIf
   
   If FindString(Masque$, "%mss", 1)
      
      Masque$ = ReplaceString(Masque$,"%mss", RSet(Str(MilliSeconds), 3, "0"))
      
   EndIf
   
   If FindString(Masque$, "%ms", 1)
      
      Masque$ = ReplaceString(Masque$,"%ms", RSet(Str(MilliSeconds), 2, "0"))
      
   EndIf
   
   ProcedureReturn Masque$
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver le nombre de Millisecondes <<<<<

ProcedureDLL CalculateMilliseconds(MilliSeconds.l, Seconds.l)
   
   ProcedureReturn MilliSeconds + SecondsToMilliseconds(Seconds)
   
EndProcedure

ProcedureDLL CalculateMilliseconds2(MilliSeconds.l, Seconds.l, Minutes.l)
   
   ProcedureReturn MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes)
   
EndProcedure

ProcedureDLL CalculateMilliseconds3(MilliSeconds.l, Seconds.l, Minutes.l, Hours.l)
   
   ProcedureReturn MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes) + HoursToMilliseconds(Hours)
   
EndProcedure

ProcedureDLL CalculateMilliseconds4(MilliSeconds.l, Seconds.l, Minutes.l, Hours.l, Days.l)
   
   ProcedureReturn MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes) + HoursToMilliseconds(Hours) + DaysToMilliseconds(Days)
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<
; <<<< END OF FILE <<<<
; <<<<<<<<<<<<<<<<<<<<<

Posted: Thu Aug 03, 2006 12:26 am
by mskuma
Thanks alot Guimauve, the FormatMilliseconds function was handy - also thanks for taking the time to update it to v4.

Posted: Thu Aug 03, 2006 6:55 pm
by Guimauve
Ok, I will place an updated version for PB V4.0 next week-end.

Be patient.

Regards
Guimauve

Posted: Fri Aug 04, 2006 8:27 pm
by Guimauve
Hello everyone

I have Updated this small lib to Version 2.0.0 but I think TailBite can't handle the optionals parameters and any procedure returning string.

All command name are in english but the comments are in French, sorry.

Regards

Guimauve

Save this file as : Chronometer_Temporizer_Structure.pb
And compile it in first

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code généré par : Éditeur de données
; Nom du projet : Structure Chronometer
; Fichier : Résident
; Version du fichier : 2.0.0
; Programmation : OK
; Programmé par :  Guimauve
; Date : 31-12-2005
; Mise à jour : 04-08-2006
; Codé pour PureBasic V4.00
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure >>>>>

Structure Chronometer
   
   StartTime.l
   TotalTime.l
   Running.b
   
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs >>>>>

Macro SetChronometerStartTime(ChronoA, P_StartTime)
   
   ChronoA\StartTime = P_StartTime
   
EndMacro

Macro SetChronometerTotalTime(ChronoA, P_TotalTime)
   
   ChronoA\TotalTime = P_TotalTime
   
EndMacro

Macro SetChronometerRunning(ChronoA, P_Running)
   
   ChronoA\Running = P_Running
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs >>>>>

Macro GetChronometerStartTime(ChronoA)
   
   ChronoA\StartTime
   
EndMacro

Macro GetChronometerTotalTime(ChronoA)
   
   ChronoA\TotalTime
   
EndMacro

Macro GetChronometerRunning(ChronoA)
   
   ChronoA\Running
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Copy >>>>>

Macro CopyChronometer(ChronoA, ChronoB)
   
   CopyMemory(ChronoA, ChronoB, 9)
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Compare >>>>>

Macro CompareChronometer(ChronoA, ChronoA)
   
   CompareMemory(ChronoA, ChronoB, 9)
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur ResetALL >>>>>

Macro ResetChronometer(ChronoA)
   
   SetChronometerStartTime(ChronoA, 0)
   SetChronometerTotalTime(ChronoA, 0)
   SetChronometerRunning(ChronoA, 0)
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Lecture fichier Binaire >>>>>

Macro ReadChronometer(FileID, ChronoA)

   ReadData(FileID, ChronoA, 9)
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Écriture fichier Binaire >>>>>

Macro WriteChronometer(FileID, ChronoA)

   WriteData(FileID, ChronoA, 9)
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Macro de déboguage >>>>>

Macro DebugChronometer(ChronoA)
   
   Debug GetChronometerStartTime(ChronoA)
   Debug GetChronometerTotalTime(ChronoA)
   Debug GetChronometerRunning(ChronoA)
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 219 ms <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des secondes en MS <<<<<

Macro SecondsToMilliseconds(Seconds)
   
    (Seconds * 1000)
   
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des minutes en MS <<<<<

Macro MinutesToMilliseconds(Minutes)
   
   (Minutes * 60000)
   
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des heures en MS <<<<<

Macro HoursToMilliseconds(Hours)
   
   (Hours * 3600000)
   
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des Jours en MS <<<<<

Macro DaysToMilliseconds(Days)
   
   (Days * 86400000)
   
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver le nombre de Millisecondes <<<<<

Macro CalculateMilliseconds(MilliSeconds, Seconds = 0, Minutes = 0, Hours = 0, Days = 0)
   
   (MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes) + HoursToMilliseconds(Hours) + DaysToMilliseconds(Days))
   
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<< FIN DU FICHIER <<<<
; <<<<<<<<<<<<<<<<<<<<<<<<
Then save this one as : Chronometer_Temporizer_Methods.pb
And compile it in second

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Méthodes de la Structure Chronometer
; Fichier : Librairie
; Version du fichier : 2.0.0
; Programmation : OK
; Programmé par : Guimauve
; Date : 31-12-2005
; Mise à jour : 04-08-2006
; Codé pour PureBasic V4.00
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Description :
;
; Cette librairie permet de créer des Chronomètres
; et des Temporisateurs de haute précision. 
;
; Temps maximal de mémorisation : capacité d'un 
; entier (long) de 4 octets ou 32 bits
;
; soit 2 147 483 647 millisecondes
;
; ou soit :
;
; 24 jours
; 20 heures
; 31 minutes
; 23 secondes
; 647 millisecondes
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Lecture d'un groupe Préférences >>>>>

ProcedureDLL ReadPreferenceChronometer(GroupName.s, *ChronoA.Chronometer)
   
   PreferenceGroup(GroupName)
   
   SetChronometerStartTime(*ChronoA, ReadPreferenceLong("StartTime", GetChronometerStartTime(*ChronoA)))
   SetChronometerTotalTime(*ChronoA, ReadPreferenceLong("TotalTime", GetChronometerTotalTime(*ChronoA)))
   SetChronometerRunning(*ChronoA, ReadPreferenceLong("Running", GetChronometerRunning(*ChronoA)))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Lecture d'un groupe Préférences >>>>>

ProcedureDLL WritePreferenceChronometer(GroupName.s, *ChronoA.Chronometer)
   
   PreferenceGroup(GroupName)
   
   WritePreferenceLong("StartTime", GetChronometerStartTime(*ChronoA))
   WritePreferenceLong("TotalTime", GetChronometerTotalTime(*ChronoA))
   WritePreferenceLong("Running", GetChronometerRunning(*ChronoA))
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démmarer Chronometer <<<<<

ProcedureDLL StartChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #False
      
      SetChronometerStartTime(*ChronoA, ElapsedMilliseconds())
      SetChronometerRunning(*ChronoA, #True)
      
   EndIf
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter Chronometer <<<<<

ProcedureDLL StopChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      SetChronometerTotalTime(*ChronoA, GetChronometerTotalTime(*ChronoA) + ElapsedMilliseconds() - GetChronometerStartTime(*ChronoA))
      SetChronometerRunning(*ChronoA, #False)
      
   EndIf 
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter Chronometer <<<<<

ProcedureDLL.l ConsultChronometer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      TotalTime.l = GetChronometerTotalTime(*ChronoA) + ElapsedMilliseconds() - GetChronometerStartTime(*ChronoA)
      
   Else
      
      TotalTime = GetChronometerTotalTime(*ChronoA)
      
   EndIf 
   
   ProcedureReturn TotalTime
EndProcedure 


; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajuster le temps du Temporizer <<<<<

ProcedureDLL SetTemporizerTotalTime(*ChronoA.Chronometer, MilliSeconds.l, Seconds.l = 0, Minutes.l = 0, Hours.l = 0, Days.l = 0)
   
   SetChronometerTotalTime(*ChronoA, CalculateMilliseconds(MilliSeconds, Seconds, Minutes, Hours, Days))
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démmarer Temporisateur <<<<<

ProcedureDLL StartTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #False
      
      SetChronometerStartTime(*ChronoA, ElapsedMilliseconds())
      SetChronometerRunning(*ChronoA, #True)
      
   EndIf
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter le Temporisateur <<<<<

ProcedureDLL StopTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      SetChronometerTotalTime(*ChronoA, GetChronometerTotalTime(*ChronoA) - ElapsedMilliseconds() + GetChronometerStartTime(*ChronoA))
      SetChronometerRunning(*ChronoA, #False)
      
   EndIf 
   
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter le Temporisateur <<<<<

ProcedureDLL.l ConsultTemporizer(*ChronoA.Chronometer)
   
   If GetChronometerRunning(*ChronoA) = #True
      
      TotalTime.l = GetChronometerTotalTime(*ChronoA) - ElapsedMilliseconds() + GetChronometerStartTime(*ChronoA)
      
   Else
      
      TotalTime = GetChronometerTotalTime(*ChronoA)
      
   EndIf 
   
   ProcedureReturn TotalTime
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Reset du temporisateur >>>>>

ProcedureDLL ResetTemporizer(*ChronoA.Chronometer, TotalTime.l)
   
   SetChronometerStartTime(*ChronoA, 0)
   SetChronometerTotalTime(*ChronoA, TotalTime)
   SetChronometerRunning(*ChronoA, #False)
   
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Conversion de milliseconde vers en j : H : M : S : Ms <<<<<

ProcedureDLL.s FormatMilliseconds(Mask$, MilliSeconds)
   
   ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   ; <<<<< On fait l'extraction des jours, Heures, minutes, secondes et des MS <<<<<
   
   If MilliSeconds < 0 
      MilliSeconds = MilliSeconds * -1
   EndIf 
   
   Days = MilliSeconds / 86400000 
   MilliSeconds % 86400000
   
   Hours = MilliSeconds / 3600000
   MilliSeconds % 3600000
   
   Minutes = MilliSeconds / 60000
   MilliSeconds % 60000
   
   Seconds = MilliSeconds / 1000
   MilliSeconds % 1000
   
   ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   ; <<<<< On s'occupe du filtre de sortie <<<<<
   
   If FindString(Mask$, "%dd", 1)
      
      Mask$ = ReplaceString(Mask$,"%dd", RSet(Str(Days), 2, "0"))
      
   EndIf 
   
   If FindString(Mask$, "%hh", 1)
      
      Mask$ = ReplaceString(Mask$,"%hh", RSet(Str(Hours), 2, "0"))
      
   EndIf 
   
   If FindString(Mask$, "%mm", 1)
      
      Mask$ = ReplaceString(Mask$,"%mm", RSet(Str(Minutes), 2, "0"))
      
   EndIf 
   
   If FindString(Mask$, "%ss", 1)
      
      Mask$ = ReplaceString(Mask$,"%ss", RSet(Str(Seconds), 2, "0"))
      
   EndIf 
   
   If FindString(Mask$, "%mss", 1)
      
      Mask$ = ReplaceString(Mask$,"%mss", RSet(Str(MilliSeconds), 3, "0"))
      
   EndIf
   
   If FindString(Mask$, "%ms", 1)
      
      Mask$ = ReplaceString(Mask$,"%ms", RSet(Str(MilliSeconds), 2, "0"))
      
   EndIf 
   
   ProcedureReturn Mask$
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<< FIN DU FICHIER <<<<
; <<<<<<<<<<<<<<<<<<<<<<<<

Posted: Sat Sep 30, 2006 6:43 pm
by Guimauve
Hello again

I have just recreated my Chronometer/Temporizer in OOP with PB.

To avoid conflict between different programming style the Structure is different but do exactly the same thing. BTW sorry for the French comment and testing code.

Regards

Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : OOP Chrono and Tempo
; Fichier : OOP Chronometer.pb
; Version : 1.0.0
; Programmation = OK
; Programmé par : Guimauve
; Date : 30-09-2006
; Mise à jour : 30-09-2006
; Codé avec PureBasic V4.00
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Class_Chrono
  
  VTable.l
  StartTime.l
  TotalTime.l
  Running.b
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de l'interface <<<<<

Interface Chrono
  
  StartChrono()
  StopChrono()
  ConsultChrono()
  ResetChrono()
  SetTempoTotalTime(MilliSeconds.l)
  StartTempo()
  StopTempo()
  ConsultTempo()
  ResetTempo(TotalTime.l)
  
EndInterface

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le constructeur de la classe Chrono <<<<<

Procedure.l CreateNewChrono()
  
  Protected *newobject.Class_Chrono
  
  *newobject = AllocateMemory(SizeOf(Class_Chrono))
  *newobject\VTable = ?Chrono_VTable
  
  ProcedureReturn *newobject
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démarrer Chronometer <<<<<

Procedure StartChrono(*Self.Class_Chrono)
  
  If *Self\Running = #False
    *Self\StartTime = ElapsedMilliseconds()
    *Self\Running = #True 
  EndIf
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter Chronometer <<<<<

Procedure StopChrono(*Self.Class_Chrono)
  
  If *Self\Running = #True
    *Self\TotalTime = *Self\TotalTime + ElapsedMilliseconds() - *Self\StartTime
    *Self\Running = #False
  EndIf 
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter Chronometer <<<<<

Procedure ConsultChrono(*Self.Class_Chrono)
  
  If *Self\Running = #True
    ChronoTotalTime.l = *Self\TotalTime + ElapsedMilliseconds() - *Self\StartTime 
  Else
    ChronoTotalTime = *Self\TotalTime
  EndIf 
  
  ProcedureReturn ChronoTotalTime
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Reset du Chronometer >>>>>

Procedure ResetChrono(*Self.Class_Chrono)
  
  *Self\StartTime  = 0
  *Self\TotalTime = 0
  *Self\Running = #False
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajuster le temps du Temporizer <<<<<

Procedure SetTempoTotalTime(*Self.Class_Chrono, MilliSeconds.l)
  
  *Self\TotalTime = MilliSeconds
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démarrer Temporisateur <<<<<

Procedure StartTempo(*Self.Class_Chrono)
  
  If *Self\Running = #False
    *Self\StartTime = ElapsedMilliseconds()
    *Self\Running = #True
  EndIf
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter le Temporisateur <<<<<

Procedure StopTempo(*Self.Class_Chrono)
  
  If *Self\Running = #True
    *Self\TotalTime = *Self\TotalTime - ElapsedMilliseconds() + *Self\StartTime
    *Self\Running = #False
  EndIf 
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter le Temporisateur <<<<<

Procedure ConsultTempo(*Self.Class_Chrono)
  
  If *Self\Running = #True
    ChronoTotalTime.l = *Self\TotalTime - ElapsedMilliseconds() + *Self\StartTime 
  Else 
    ChronoTotalTime = *Self\TotalTime
  EndIf 
  
  ProcedureReturn ChronoTotalTime
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Reset du temporisateur >>>>>

Procedure ResetTempo(*Self.Class_Chrono, TotalTime.l)
  
  *Self\StartTime  = 0
  *Self\TotalTime = TotalTime
  *Self\Running = #False
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< La VTable de la classe Chrono <<<<<

DataSection ;>
  
  Chrono_VTable:
  Data.l @StartChrono()
  Data.l @StopChrono()
  Data.l @ConsultChrono()
  Data.l @ResetChrono()
  Data.l @SetTempoTotalTime()
  Data.l @StartTempo()
  Data.l @StopTempo()
  Data.l @ConsultTempo()
  Data.l @ResetTempo()
  
EndDataSection ;<

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< CODE D'ESSAI <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<

MonChronometre.Chrono = CreateNewChrono()
MonTemporisateur.Chrono = CreateNewChrono()

MonTemporisateur\SetTempoTotalTime(2500)

Debug "Test du chrono OOP"

MonChronometre\StartChrono()
MonTemporisateur\StartTempo()

Debug "On Chronomètre le temporisateur (2500 ms)"
Debug "C'est pour voir si les méthodes fonctionnent"

Repeat
  
  If MonTemporisateur\ConsultTempo() <= 0 
    MonChronometre\StopChrono()
    MonTemporisateur\StopTempo()
    Quitter = #True
  EndIf
  
Until Quitter = #True

Debug "Si le temps lu dans le chronomètre est" 
Debug "environ 2500 ms, c'est que ça marche bien"

Debug "On consulte le chronomètre : " + Str(MonChronometre\ConsultChrono())

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<

Re: Chronometer - Temporizer V1.0.3 - Updated to V2.0.0

Posted: Sun Jan 27, 2013 3:38 am
by Guimauve
Hello everyone,

Sorry to re-open a old topic but for the Project I'm currently work on I need to update my old Chronometer lib to work with seconds instead of milliseconds. So instead to create two different Chronometer libs I have just tweak the first one to allow the possibility to work with seconds base time chronometer. By default the Chronometer use milliseconds base time.

Have fun !

Best regards
Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code généré par : Dev-Type V4.0.0
; Nom du projet : Chronometer
; Nom du fichier : Chronometer.pb
; Version du fichier : 3.0.0
; Programmation : OK
; Programmé par : Guimauve
; Date : 31-12-2005
; Mise à jour : 26-01-2013
; Codé pour : PureBasic 5.10 Beta 5
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#CHRONOMETER_BASETIME_MILLISECONDS = 0
#CHRONOMETER_BASETIME_SECONDS = 1

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Chronometer

  BaseTime.b
  TotalTime.q
  StartTime.q
  IsRunning.b

EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetChronometerBaseTime(ChronometerA)
  
  ChronometerA\BaseTime
  
EndMacro

Macro GetChronometerTotalTime(ChronometerA)
  
  ChronometerA\TotalTime
  
EndMacro

Macro GetChronometerStartTime(ChronometerA)
  
  ChronometerA\StartTime
  
EndMacro

Macro GetChronometerIsRunning(ChronometerA)
  
  ChronometerA\IsRunning
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetChronometerBaseTime(ChronometerA, P_BaseTime)
  
  GetChronometerBaseTime(ChronometerA) = P_BaseTime
  
EndMacro

Macro SetChronometerTotalTime(ChronometerA, P_TotalTime)
  
  GetChronometerTotalTime(ChronometerA) = P_TotalTime
  
EndMacro

Macro SetChronometerStartTime(ChronometerA, P_StartTime)
  
  GetChronometerStartTime(ChronometerA) = P_StartTime
  
EndMacro

Macro SetChronometerIsRunning(ChronometerA, P_IsRunning)
  
  GetChronometerIsRunning(ChronometerA) = P_IsRunning
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetChronometer(ChronometerA)
 
  SetChronometerBaseTime(ChronometerA, 0)
  SetChronometerTotalTime(ChronometerA, 0)
  SetChronometerStartTime(ChronometerA, 0)
  SetChronometerIsRunning(ChronometerA, 0)

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Copy : A = Source : B = Destination <<<<<

Macro CopyChronometer(ChronometerA, ChronometerB)
 
  SetChronometerBaseTime(ChronometerB, GetChronometerBaseTime(ChronometerA))
  SetChronometerTotalTime(ChronometerB, GetChronometerTotalTime(ChronometerA))
  SetChronometerStartTime(ChronometerB, GetChronometerStartTime(ChronometerA))
  SetChronometerIsRunning(ChronometerB, GetChronometerIsRunning(ChronometerA))

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Compare <<<<<

Procedure.b CompareChronometer(*ChronometerA.Chronometer, *ChronometerB.Chronometer)
 
  If GetChronometerBaseTime(*ChronometerA) <> GetChronometerBaseTime(*ChronometerB)
    ProcedureReturn #False
  EndIf
 
  If GetChronometerTotalTime(*ChronometerA) <> GetChronometerTotalTime(*ChronometerB)
    ProcedureReturn #False
  EndIf
 
  If GetChronometerStartTime(*ChronometerA) <> GetChronometerStartTime(*ChronometerB)
    ProcedureReturn #False
  EndIf
 
  If GetChronometerIsRunning(*ChronometerA) <> GetChronometerIsRunning(*ChronometerB)
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Swap <<<<<

Macro SwapChronometer(ChronometerA, ChronometerB)

  Swap GetChronometerBaseTime(ChronometerA), GetChronometerBaseTime(ChronometerB)
  Swap GetChronometerTotalTime(ChronometerA), GetChronometerTotalTime(ChronometerB)
  Swap GetChronometerStartTime(ChronometerA), GetChronometerStartTime(ChronometerB)
  Swap GetChronometerIsRunning(ChronometerA), GetChronometerIsRunning(ChronometerB)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Lecture d'un groupe Préférences <<<<<

Procedure ReadPreferenceChronometer(GroupName.s, *ChronometerA.Chronometer)

  PreferenceGroup(GroupName)
 
  SetChronometerBaseTime(*ChronometerA, ReadPreferenceLong("BaseTime", GetChronometerBaseTime(*ChronometerA)))
  SetChronometerTotalTime(*ChronometerA, ReadPreferenceQuad("TotalTime", GetChronometerTotalTime(*ChronometerA)))

EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Écriture d'un groupe de Préférences <<<<<

Procedure WritePreferenceChronometer(GroupName.s, *ChronometerA.Chronometer)

  PreferenceGroup(GroupName)
 
  WritePreferenceLong("BaseTime", GetChronometerBaseTime(*ChronometerA))
  WritePreferenceQuad("TotalTime", GetChronometerTotalTime(*ChronometerA))

EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Lecture sur fichier Binaire <<<<<

Procedure ReadChronometer(FileID.l, *ChronometerA.Chronometer)
 
  SetChronometerBaseTime(*ChronometerA, ReadByte(FileID))
  SetChronometerTotalTime(*ChronometerA, ReadQuad(FileID))

EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Écriture sur fichier Binaire <<<<<

Procedure WriteChronometer(FileID.l, *ChronometerA.Chronometer)
 
  WriteByte(FileID, GetChronometerBaseTime(*ChronometerA))
  WriteQuad(FileID, GetChronometerTotalTime(*ChronometerA))

EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Initialize <<<<<

Procedure InitializeChronometer(*ChronometerA.Chronometer, P_BaseTime.b = #CHRONOMETER_BASETIME_MILLISECONDS)
 
  SetChronometerBaseTime(*ChronometerA, P_BaseTime)
  SetChronometerTotalTime(*ChronometerA, 0)
  SetChronometerStartTime(*ChronometerA, 0)
  SetChronometerIsRunning(*ChronometerA, 0)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.006 secondes (37666.67 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des secondes en MS <<<<<

Macro SecondsToMilliseconds(Seconds)
  
  (Seconds * 1000)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des minutes en MS <<<<<

Macro MinutesToMilliseconds(Minutes)
  
  (Minutes * 60000)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des heures en MS <<<<<

Macro HoursToMilliseconds(Hours)
  
  (Hours * 3600000)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des Jours en MS <<<<<

Macro DaysToMilliseconds(Days)
  
  (Days * 86400000)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des minutes en Secondes <<<<<

Macro MinutesToSeconds(Minutes)
  
  (Minutes * 60)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des heures en Secondes <<<<<

Macro HoursToSeconds(Hours)
  
  (Hours * 3600)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Convertir des Jours en Secondes <<<<<

Macro DaysToSeconds(Days)
  
  (Days * 86400)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver le nombre de Millisecondes <<<<<

Macro CalculateMilliseconds(MilliSeconds, Seconds = 0, Minutes = 0, Hours = 0, Days = 0)
  
  (MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes) + HoursToMilliseconds(Hours) + DaysToMilliseconds(Days))
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver le nombre de Secondes <<<<<

Macro CalculateSeconds(Seconds, Minutes = 0, Hours = 0, Days = 0)
  
  (Seconds + MinutesToSeconds(Minutes) + HoursToSeconds(Hours) + DaysToSeconds(Days))
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démmarer Chronometer <<<<<

Procedure StartChronometer(*ChronometerA.Chronometer)
  
  If GetChronometerIsRunning(*ChronometerA) = #False
    
    If GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_MILLISECONDS
      SetChronometerStartTime(*ChronometerA, ElapsedMilliseconds())
    ElseIf GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_SECONDS
      SetChronometerStartTime(*ChronometerA, Date())
    EndIf
    
    SetChronometerIsRunning(*ChronometerA, #True)
    
  EndIf
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter Chronometer <<<<<

Procedure StopChronometer(*ChronometerA.Chronometer)
  
  If GetChronometerIsRunning(*ChronometerA) = #True
    
    If GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_MILLISECONDS
      SetChronometerTotalTime(*ChronometerA, GetChronometerTotalTime(*ChronometerA) + ElapsedMilliseconds() - GetChronometerStartTime(*ChronometerA))
    ElseIf GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_SECONDS
      SetChronometerTotalTime(*ChronometerA, GetChronometerTotalTime(*ChronometerA) + Date() - GetChronometerStartTime(*ChronometerA))
    EndIf
    
    SetChronometerIsRunning(*ChronometerA, #False)
    
  EndIf 
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter Chronometer <<<<<

Procedure.q ConsultChronometer(*ChronometerA.Chronometer)
  
  If GetChronometerIsRunning(*ChronometerA) = #True
    
    If GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_MILLISECONDS
      TotalTime.q = GetChronometerTotalTime(*ChronometerA) + ElapsedMilliseconds() - GetChronometerStartTime(*ChronometerA)
    ElseIf GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_SECONDS
      TotalTime = GetChronometerTotalTime(*ChronometerA) + Date() - GetChronometerStartTime(*ChronometerA)
    EndIf
    
  Else
    TotalTime = GetChronometerTotalTime(*ChronometerA)
  EndIf 
  
  ProcedureReturn TotalTime
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajuster le temps du Temporizer <<<<<

Procedure SetTemporizerTotalTime(*ChronometerA.Chronometer, MilliSeconds.l, Seconds.l, Minutes.l, Hours.l, Days.l)
  
  SetChronometerTotalTime(*ChronometerA, MilliSeconds + SecondsToMilliseconds(Seconds) + MinutesToMilliseconds(Minutes) + HoursToMilliseconds(Hours) + DaysToMilliseconds(Days))
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Démmarer Temporisateur <<<<<

Procedure StartTemporizer(*ChronometerA.Chronometer)
  
  If GetChronometerIsRunning(*ChronometerA) = #False
    
    If GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_MILLISECONDS
      SetChronometerStartTime(*ChronometerA, ElapsedMilliseconds())
    ElseIf GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_SECONDS
      SetChronometerStartTime(*ChronometerA, Date())
    EndIf
    
    SetChronometerIsRunning(*ChronometerA, #True)
    
  EndIf
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Arrèter le Temporisateur <<<<<

Procedure StopTemporizer(*ChronometerA.Chronometer)

  If GetChronometerIsRunning(*ChronometerA) = #True
    
    If GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_MILLISECONDS
      SetChronometerTotalTime(*ChronometerA, GetChronometerTotalTime(*ChronometerA) - ElapsedMilliseconds() + GetChronometerStartTime(*ChronometerA))
    ElseIf GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_SECONDS
      SetChronometerTotalTime(*ChronometerA, GetChronometerTotalTime(*ChronometerA) - Date() + GetChronometerStartTime(*ChronometerA))
    EndIf
    
    SetChronometerIsRunning(*ChronometerA, #False)
    
  EndIf 
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Consulter le Temporisateur <<<<<

Procedure.q ConsultTemporizer(*ChronometerA.Chronometer)
  
  If GetChronometerIsRunning(*ChronometerA) = #True
    
    If GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_MILLISECONDS
      TotalTime.q = GetChronometerTotalTime(*ChronometerA) - ElapsedMilliseconds() + GetChronometerStartTime(*ChronometerA)
    ElseIf GetChronometerBaseTime(*ChronometerA) = #CHRONOMETER_BASETIME_SECONDS
      TotalTime = GetChronometerTotalTime(*ChronometerA) - Date() + GetChronometerStartTime(*ChronometerA)
    EndIf
    
  Else
    TotalTime = GetChronometerTotalTime(*ChronometerA)
  EndIf 
  
  ProcedureReturn TotalTime
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Reset du temporisateur >>>>>

Procedure ResetTemporizer(*ChronometerA.Chronometer, P_TotalTime.q, P_BaseTime.b = #CHRONOMETER_BASETIME_MILLISECONDS)
  
  SetChronometerBaseTime(*ChronometerA, P_BaseTime)
  SetChronometerStartTime(*ChronometerA, 0)
  SetChronometerTotalTime(*ChronometerA, P_TotalTime)
  SetChronometerIsRunning(*ChronometerA, #False)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Conversion de milliseconde vers en j : H : M : S : Ms <<<<<

Procedure.s FormatMilliseconds(Mask.s, MilliSeconds.l)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< On fait l'extraction des jours, Heures, minutes, secondes et des MS <<<<<
  
  If MilliSeconds < 0 
    MilliSeconds = MilliSeconds * -1
  EndIf 
  
  Days = MilliSeconds / 86400000 
  MilliSeconds % 86400000
  
  Hours = MilliSeconds / 3600000
  MilliSeconds % 3600000
  
  Minutes = MilliSeconds / 60000
  MilliSeconds % 60000
  
  Seconds = MilliSeconds / 1000
  MilliSeconds % 1000
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< On s'occupe du filtre de sortie <<<<<
  
  If FindString(Mask, "%dd", 1)
    Mask = ReplaceString(Mask,"%dd", RSet(Str(Days), 2, "0"))
  EndIf 
  
  If FindString(Mask, "%hh", 1)
    Mask = ReplaceString(Mask,"%hh", RSet(Str(Hours), 2, "0"))
  EndIf 
  
  If FindString(Mask, "%mm", 1)
    Mask = ReplaceString(Mask,"%mm", RSet(Str(Minutes), 2, "0"))
  EndIf 
  
  If FindString(Mask, "%ss", 1)
    Mask = ReplaceString(Mask,"%ss", RSet(Str(Seconds), 2, "0"))
  EndIf 
  
  If FindString(Mask, "%mss", 1)
    Mask = ReplaceString(Mask,"%mss", RSet(Str(MilliSeconds), 3, "0"))
  EndIf
  
  If FindString(Mask, "%ms", 1)
    Mask = ReplaceString(Mask,"%ms", RSet(Str(MilliSeconds), 2, "0"))
  EndIf 
  
  ProcedureReturn Mask
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Formater des scondes <<<<<

Procedure.s FormatSeconds(Mask.s, Seconds.q)
  
  ; Extraction des jours, heures, minutes et secondes
  
  Days = Seconds / 86400 
  Seconds % 86400
  
  Hours = Seconds / 3600
  Seconds % 3600
  
  Minutes = Seconds / 60
  Seconds % 60
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< On s'occupe du filtre de sortie <<<<<
  
  If FindString(Mask, "%dd", 1)
    Mask = ReplaceString(Mask,"%dd", RSet(Str(Days), 2, "0"))
  EndIf 
  
  If FindString(Mask, "%hhhhhh", 1)
    Mask = ReplaceString(Mask,"%hhhhhh", RSet(Str(Hours+Days*24), 6, "0"))
  EndIf 
  
  If FindString(Mask, "%hhhhh", 1)
    Mask = ReplaceString(Mask,"%hhhhh", RSet(Str(Hours+Days*24), 5, "0"))
  EndIf 
  
  If FindString(Mask, "%hhhh", 1)
    Mask = ReplaceString(Mask,"%hhhh", RSet(Str(Hours+Days*24), 4, "0"))
  EndIf 
  
  If FindString(Mask, "%hhh", 1)
    Mask = ReplaceString(Mask,"%hhh", RSet(Str(Hours+Days*24), 3, "0"))
  EndIf 
  
  If FindString(Mask, "%hh", 1)
    Mask = ReplaceString(Mask,"%hh", RSet(Str(Hours), 2, "0"))
  EndIf 
  
  If FindString(Mask, "%mm", 1)
    Mask = ReplaceString(Mask,"%mm", RSet(Str(Minutes), 2, "0"))
  EndIf 
  
  If FindString(Mask, "%ss", 1)
    Mask = ReplaceString(Mask,"%ss", RSet(Str(Seconds), 2, "0"))
  EndIf 
  
  ProcedureReturn Mask
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<

Re: Chronometer - Temporizer V1.0.3 - Updated to V2.0.0

Posted: Sun Jan 27, 2013 6:31 pm
by said
Hi Guimauve,

Thanks for sharing. Can i ask a question, what is Dev-Type that you keep using to generate all those macros?

Thanks,
Said

Re: Chronometer - Temporizer V1.0.3 - Updated to V2.0.0

Posted: Sun Jan 27, 2013 7:17 pm
by Guimauve
said wrote:Hi Guimauve,

Thanks for sharing. Can i ask a question, what is Dev-Type that you keep using to generate all those macros?

Thanks,
Said
OK Dev-Type it's a small program I have created something like 7 years ago (originally it's name was "Type Editor")
It generate a lot of macros but not only macros. It generate 242 different commands (Macros and procedures) depending about what the user want to do with structure.
Unfortunately, the PureBasic development is simply to fast to follow furthermore the program is still under development.

But this topic is not a place to discuss about this tool. I will create a topic dedicated to this tool in http://www.purebasic.fr/english/viewforum.php?f=27 forum.

Best regards
Guimauve