Soyez le premier à donner votre avis sur cette source.
Vue 20 785 fois - Téléchargée 2 154 fois
// // Auteur : Delphiprog // Email : delphi@delphiprog.fr.fm // Web : http://www.delphiprog.fr.fm // Date création : 29/05/2002 // Date révision : 31/08/2003 { Objet : Afficher un chronomètre ayant une précision de l'ordre du millième de seconde avec un seul bouton déclenchant les opérations de marche/arrêt. } { remarques : illustration de l'utilisation d'un thread Ce dernier aurait pu être évité dans cet exemple sauf que, pour ne pas bloquer le processus du chronomètre, il valait mieux utiliser cette méthode. A noter que le calcul continue de se faire même quand la fiche est déplacée ou redimensionnée, contrairement à une application mono thread. } unit UChronoFrm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const BtnStartCaption: array[boolean] of ShortString = ('Démarrer le chronomètre', 'Arrêter le chronomètre'); type //Thread chargé des calculs et de l'affichage //du temps écoulé TChronoThread = class(TThread) private { Déclarations privées } FDepart: TDateTime; protected constructor Create(CreateSuspended: Boolean); procedure Execute; override; procedure AfficherDuree; end; TChronoForm = class(TForm) lblElapsedTime: TLabel; btnStart: TButton; Label2: TLabel; procedure btnStartClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); end; var ChronoForm: TChronoForm; ChronoThread: TChronoThread; implementation {$R *.DFM} var Stop: boolean = True; procedure TChronoForm.btnStartClick(Sender: TObject); begin btnStart.Caption := BtnStartCaption[Stop]; Stop := not Stop; if not Stop then begin //Réinitialisation de l'affichage lblElapsedTime.Caption := '00:00:00.000'; //Lancement du thread en mode suspendu ChronoThread := TChronoThread.Create(True); end else //Demander au thread de s'arrêter ChronoThread.Terminate; end; procedure TChronoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin //Détruire le thread s'il a été créé et s'il //est actif au moment de la fermeture de l'application if Assigned(Chronothread) then if not ChronoThread.Terminated then ChronoThread.Terminate; end; { TChronoThread } constructor TChronoThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); //Détruire à la sortie FreeOnTerminate := True; //Initialisation de la valeur de départ //du chronomètre FDepart := Now; //Détermination de la priorité du thread Priority := tpNormal; //Si le thread est en attente, le démarrer if CreateSuspended then Resume; end; procedure TChronoThread.Execute; begin //Boucler tant que l'utilisateur n'a pas //demandé de stopper while not Terminated do Synchronize(AfficherDuree); end; procedure TChronoThread.AfficherDuree; begin ChronoForm.lblElapsedTime.Caption := FormatDateTime('hh:mm:ss.zzz', Now - FDepart); end; end.
je suis nouveau sur le site et j'étudie les threads pour faire un logiciel, avec Delphi, de lecture et traitement de signaux gps.
Au message précédent je peux répondre que j'en ai fait un depuis longtemps, on peut mettre autant de chronos que l'on veut, avec affichage de temps intermédiaire, sans utiliser les threads. Je l'avais fait pour étudier l'affichage de temps écoulé.
Merci de votre aide, J'aime bien savoir si possible d'avoir plusieurs choronos
A la fois, C à d a chaque fois q?un utilisateur click sur un bouton un chrono peut
Etre crée et déclenche comme en peut arrête certains que sont en cours d'exécution
,s'il y a une solution ça m?intéresse Beaucoup
A+
J'ai pas pigé c'est quoi synchronize. bon je peux savoir c'est quoi en chercher dans le net, mais la je parle a chaud lol
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.