on veut faire un programme où on utilise une horloge comment utiliser un objet timer pour incrémenter cette horloge en temps réel .
Version imprimable
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:
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 la :faq: http://delphi.developpez.com/faq/?pa...ometrageprecisCitation:
Envoyé par Gilbert Geyer
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 aideCode:
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;
A Nememoris :
Dans mon message précédent du 15/03/2007 16h24 tu trouves l'ensemble des trucs à recopier donc je résume simplement ici pour les emplacements :
... ainsi tu peux utiliser plusieurs Chronos (var Chrono2, Chrono3 : cChrono);)depuis n'importe quelle unité de ton appli ... pour ma part je places en général les trucs d'utilisation courante comme ce type cChrono = object et les procédures et fonctions qui le concernent dans une unité qu'on peut nommer maCaisseAOutils ... qu'on peut trimballer d'une appli à l'autre sans avoir à retaper du code.Code:
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
30 le type cChrono = object // partie qu'on met par exemple après le var Form5 : tForm //et avant la zone Implementation .... ... end; procedure cChrono.Top; // < à placer ensuite n'importe où dans la zone implémentation après {$R *.dfm} begin ... end; function cChrono.Mis : shortString; // idem que pour cChrono.Top begin ... end; // Ensuite : Exemple d''utilisation avec 1 seul chrono : // dans la zone Implémentation de la même unité ou d'une autre unité (celle // de Form3 dans l'exemple ci-desous) dont le uses cite l''unité dans laquelle le // type cChrono est déclaré (donc celle de Form5 dans le présent exemple) : procedure Form3.ButtonTestChronoClick(sender..); var Chrono1 : cChrono; i : integer; begin Chrono1.Top; //< lance le top-départ du chrono for i:=1 to 10000 do begin sleep(25); //Attend 25 milli-secondes end; // Et enfin pour afficher la durée totale Showmessage('Durée totale : '+Chrono1.Mis); end;
A+:D
P.S : Précision / vocabulaire ne pas confondre "Timer" (peu fiable cars très approximatif) avec "Chrono" le cChrono utilise le compteur hautes performances.
Bonjour,
j'ajouterais qu'un Timer et un Chrono n'ont pas le même but :
- un Timer sert à exécuter un action après un temps défini (une fois ou répétitivement)
- un Chrono sert à mesurer un temps écoulé entre deux moments donnés
et ils peuvent très bien être complémentaires.
ex : un timer pour exécuter une action dans laquelle un chrono donne le temps qui s'est réellement écoulé entre deux top du timer
Enfin TTimer n'est pas très précis car il utilise la boucle des messages pour recevoir son "top" mais cela a l'avantage de ne pas nécessiter de synchronisation pour manipuler les données du thread principale, notamment les objets de la VCL.
Slt , si tu veux faire une horloge en utilisant un timer alors::mouarf:
Citation:
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Interval:=1000;
Timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text:=TimeToStr(now);
end;
merci pour ces réponses j evais voir si je m en sors dans les declarations...