Threads : exemple avec un chronomètre

Soyez le premier à donner votre avis sur cette source.

Vue 20 473 fois - Téléchargée 2 128 fois

Description

Suite à une demande sur le forum, voici une application de chronomètrage précise au millième de secondes. Pour le fun, j'ai ajouté l'utilisation d'un thread d'éxécution.

Source / Exemple :


//
// 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.

Conclusion :


Je ne dis pas que c'est hyper précis, mais çà peut donner des idées.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
27 mars 2007

Bonjour à tous,
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é.
Messages postés
10
Date d'inscription
dimanche 26 mars 2006
Statut
Membre
Dernière intervention
15 juin 2007

Bonjour DelphiProg
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+
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
La remarque est très intéressante. Je dirai même que ce petit bout de code occupe le processeur à 100% de son temps. La fréquence de rafraîchissement de l'affichage de la valeur du chrono est beaucoup trop élevée.
Messages postés
5
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
11 juillet 2012

Le chronothread fait perdre 70% de resource au processeur pourtant avec un 3ghz
Messages postés
10
Date d'inscription
mercredi 28 mai 2003
Statut
Membre
Dernière intervention
8 août 2008

c'est compliqué les thread (j'ai jamais essayé, je fait que lire la lol).
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
Afficher les 8 commentaires

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.