Chronomètre et Temporisateur V1.0.3

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Chronomètre et Temporisateur V1.0.3

Message par Guimauve »

Tout est dans le titre. Je l'ai dévellopé pour contrôler l'incrémentation des numéros de Sprite d'une animation en mode Screen. Ce chronomètre est précis mais il peut parfois donner quelques millisecondes de plus que prévue. Si vous regarder bien dans l'exemple, la condition de sortie est plus grand ou égale à 1562. C'est nécessaire pour éviter les bogues, les boucles infinies, etc.

A+
Guimauve

En passant, Bonne année à tout le monde !!

Mise à Jour : V1.0.2

Maintenant, on peut temporiser du temps. Si vous voulez en faire une Librairie avec Tailbite Couper le code de la structure, collez la dans un source séparé et compilez le. Ensuite commentez le code d'essai à la fin et compilez le.

Mise à jour : V1.0.3

L'exemple est modifié. C'est une démonstration d'une boucle temporisée auto-correctrice. De plus, il y a des nouvelles commandes.

Le masque de la commande FormatMilliseconds(Masque$, MilliSeconds) est similaire à celui de FormatDate() de PB. La seule différence est que pour les millisecondes c'est %mss pour obtenir 0.000 seconde et %ms pour obtenir 0.00 seconde.

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 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
Dernière modification par Guimauve le mar. 03/janv./2006 21:17, modifié 2 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: Chronomètre de milliseconde

Message par Chris »

Guimauve a écrit :Ce chronomètre est précis mais il peut parfois donner quelques millisecondes de plus que prévue.
Ben il est pas précis, alors :lol:
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Ce que je veux dire c'est que pendant les essais il est arrivé de sortir de
la boucle à disons 2500 ms, de faire afficher le temps cumulé dans le
chrono et de voir 2504 ou 2510 ms.

Pendant un moment hier soir j'avais le logiciel anti-virus qui travaillait en
même temps que je testais le code. Au début, je pensais que le code ne
marchait pas et je l'ai lancé plusieurs fois. Résultat j'avais plusieurs
programme coincé dans des boucles infinies.

Dans une boucle qui contient une commande qui prend disons 5 ms à
s'exécuter et que l'on désir sortir lorsque le temps cumulé est égale à 60
ms c'est parfait la boucle va tourné 12 fois et va se terminer. Le
problème survient lorsque la commande qui prennait 5 ms prend 7 ms, 60
ms ne sera jamais atteinte puisque 7*8=56 et 7*9 = 63. Donc la lecture
du chrono ne pourra jamais être égale à 60 ms. Et voilà une boucle
infinie

Tout ça pour dire que ce type de chronomètre doit être utilisé avec
prudence et que la précision est équivalente à celle donnée par la
commande ElapsedMilliseconds() de PB.

A+
Guimauve
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Je poste un message juste comme ça !!

J'ai mis l'exemple à jour.

A+
Guimauve
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Je viens de mettre une mise à jour

A+
Guimauve
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Pas mal du tout :)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Mise à jour pour la version 4.00

De plus, certaines commandes on un code optimisé commenté. Libre à vous d'éditer le code avant la compile ou l'utilisation

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 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 : Méthodes de la Structure Chronometer
; Fichier : Librairie
; Version du fichier : 1.1.3
; Programmation : OK
; Programmé par : Guimauve
; Date : 31-12-2005
; Mise à jour : 11-02-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 environ 2 147 483 secondes
; ou soit environ 35 791 minutes
; ou soit environ 596 heures
; ou soit environ 24 jours
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

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

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< 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))
   
   ; CopyMemory(*ChronoB, *ChronoA, SizeOf(Chronometer))
   
EndProcedure

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

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

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

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

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

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

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

ProcedureDLL WriteChronometer(FileID, *ChronoA.Chronometer)
   
   WriteLong(FileID, GetChronometerStartTime(*ChronoA))
   WriteLong(FileID, GetChronometerTotalTime(*ChronoA))
   WriteByte(FileID, GetChronometerRunning(*ChronoA))
   
   ; WriteData(FileID, *ChronoA, SizeOf(Chronometer))
   
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(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

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< 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 <<<<
; <<<<<<<<<<<<<<<<<<<<<<<<
Répondre