Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

THREADS : EXEMPLE AVEC UN CHRONOMÈTRE


Information sur la source

Catégorie :Tutoriaux Niveau : Expert Date de création : 30/05/2002 Date de mise à jour : 31/08/2003 14:14:40 Vu / téléchargé: 10 558 / 1 119

Note :
7,5 / 10 - par 6 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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

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

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Delphiprog le 01/06/2002 08:38:48 administrateur CS

Dans la version du 30 mai 2002, il y avait un manque important : je ne vérifiais pas que le thread était créé en fermant la fiche et celà causait donc une erreur !
Oups !

signaler à un administrateur
Commentaire de spocks50 le 04/03/2003 22:15:52

Salut  Delphiprog !
Je voi que tu a beaucoup de travail sur ce site.... bravo pour ceux qui on besoin de ton aide et jaimerais aussi que d autre repondent au questions ..... tu fais du bon travail..........merci...........

signaler à un administrateur
Commentaire de Delphiprog le 05/03/2003 19:50:01 administrateur CS

Merci !
J'espère que tu as trouvé là ce que tu cherchais.

signaler à un administrateur
Commentaire de korpica le 30/03/2004 18:15:46

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

signaler à un administrateur
Commentaire de jvth le 01/05/2005 11:38:13

Le chronothread  fait   perdre  70%  de resource au processeur  pourtant avec un  3ghz

signaler à un administrateur
Commentaire de Delphiprog le 02/05/2005 23:58:30 administrateur CS

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.

signaler à un administrateur
Commentaire de guirat le 02/11/2006 11:02:41

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+

signaler à un administrateur
Commentaire de graccus le 30/03/2007 12:59:56

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

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,27 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.