on veut faire un programme où on utilise une horloge comment utiliser un objet timer pour incrémenter cette horloge en temps réel .
on veut faire un programme où on utilise une horloge comment utiliser un objet timer pour incrémenter cette horloge en temps réel .
Tu poses un TTimer sur ta forme principale. Dans les propriétés de ce TTimer tu choisis l'intervalle de déclenchement en millisecondes avec la propriété Interval. Pour travailler tu vas dans le événements de ton TTimer : tu as OnTimer (tu double cliques dessus) qui est une procédure qui est déclenchée à chaque 'Interval' de ton TTimer
ça marche aussi en deposant un Ttimer sur ta fiche et en cliquant sur F1 par la suite![]()
Salut,
Encore une fois tout dépend de ton projet.
A première vue je répondrais:
Tu définit une variable Temps que tu incrémente à chaque évènement "OnTimer".
En revanche, je ne pense pas que l'objet timer soit idéal pour cette manipulation si tu souhaite une précision importante sur ton horloge. En effet un timer c'est un objet qui provoque un évènement toutes les X secondes. Mais comme tous les évènements, ton processus le gèrera dès qu'il en aura l'occasion (cf. processus et leurs priorités), donc le timer c'est idéal pour éffectuer un rafraîchissement par exemple, pas pour du temps réelle très précis.
Si tu souhaite réaliser une horloge précise, tu devras avoir une approche multi-tâche temps réelle bien plus complexe, avec une OS temps réelle (genre µC/OS-II ), et des diagrammes d'état, chronnogramme des tâches...Afin de t'assurer que toutes tes tâches soient bien réaliser, avec leurs priorités propres (genre incrémenter l'horloge pour rester précis à la microseconde peut être ta tâche principale) sans famine. Je me rappelle que pour simplement recupérer des données sur un port série, les datées à la ms et les afficher à l'écran, on avait dû passer une vingtaine d'heure.
Par exemple si tu utilise un timer système très précis et que tu déclenches une interruption, avec une priorité maximum, toutes les X secondes, ton horloge sera ultra-précise, mais si tes autres tâches prennent du temps alors tu auras quand même des erreurs de datation (puisque la majeur partie de ta CPU sera utilisée pour incrémenter l'horloge).
Maintenant si c'est pour dater un dossier, l'heure système suffit.
A+.
Bonjour,
A propos du timer, je confirme à toutes fins utiles qu'il n'est ni précis, ni fiable si l'on veut faire du chronométrage.
Le hasard ayant voulu que je viens (15 mars 15heure et des poussières) de répondre à une question similaire sur le forum, je vous signale que vous pourrez y trouver un exemple de code qui permet de générer des chronomètres si l'on se contente d'une précision de l'ordre de la milli-seconde.
Pour une précision plus serrée j'ai lu quelque part qu'il faut utiliser les fonctions de compteur hautes performances de l'API-Win32, c'est à dire notamment les fonctions :
- QueryPerformanceFrequency : elle renvoie la fréquence (en hertz) du compteur haute précision de la machine
- et QueryPerformanceCounter qui renvoie la valeur courante d'un compteur libre. Paraît que la résolution est souvent de l'ordre d'une nanoseconde (un milliardième de seconde) !!!. Comme c'est rare d'avoir besoin d'une telle précision et que je ne me souviens plus où j'ai mis ma source je m'en tiens à cette simple indication mais si le sujet vous intéresse, faites moi signe et je fouillerai pour vous trouver un bout de code.
C'a-y-est j'ai retrouvé en voici un:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 type cChrono = object FFrequency : Int64; // Fréquence du compteur hautes performances. FStart, FStop : Int64; // Valeurs du compteur au début et à la fin du chrono. FElapsed : Extended ; // Durée finale, en milliSecondes plus toutes les décimales procedure Top; function Mis : shortString; // chaine temps passé depuis Chrono.Top end; procedure cChrono.Top; begin if not QueryPerformanceFrequency(FFrequency) then raise Exception.Create('Pas de compteur hautes performances.'); QueryPerformanceCounter(FStart) ; end; function cChrono.Mis : shortString; begin QueryPerformanceCounter(FStop) ; FElapsed := (FStop-FStart)/FFrequency ; // Durée captée, en secondes. FElapsed := FElapsed * 1000; // Durée finale, en ms avec n décimales. Result:=floatToStr(FElapsed)+' ms'; end; // Puis pour l'utilisation : var monChrono1,monChrono2 : cChrono; // Ensuite au début du truc à chronométrer : monChrono1.Top; // lance le top-départ ici la suite du code ... // Et enfin pour afficher le temps écoulé par exemple : Showmessage(monChrono1.Mis); end;
Peut-être dans laEnvoyé par Gilbert Geyer
http://delphi.developpez.com/faq/?pa...ometrageprecis
Re-bonjour,
Effectivement, ce n'est pas "peut-être" c'est effectivement le cas mais je ne m'en souvenais que d'une seule chose c'est que j'en avais récupéré un copier-coller pour cas de besoin. A force de consulter divers sites on finit par s'embrouiller!! Bon l'essentiel est que celui qui a posé la question ait un bout de code pour continuer car y'a rien de plus agaçant que d'être bloqué quand on veut avancer.
Bonjour
Je debute et souhaiterais utiliser ce code mais souhaiterais savoir où mettre cette partie de code car je ne sais pas. je pensais dans la declaration de type mais cela ne fonctionne pas l erreur 'attendu end' s affiche'
merci de votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 type cChrono = object FFrequency : Int64; // Fréquence du compteur hautes performances. FStart, FStop : Int64; // Valeurs du compteur au début et à la fin du chrono. FElapsed : Extended ; // Durée finale, en milliSecondes plus toutes les décimales procedure Top; function Mis : shortString; // chaine temps passé depuis Chrono.Top end;
Partager