begin process at 2010 02 10 09:38:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > THREADS : EXEMPLE AVEC UN CHRONOMÈTRE

THREADS : EXEMPLE AVEC UN CHRONOMÈTRE


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :12 313 / 1 255

Auteur : Delphiprog

Ecrire un message privé
Site perso
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip TABLE DE CORRESPONDANCE TYPES DE DONNÉES API/PASCAL OBJET
Source avec Zip Source avec une capture GÉNÉRER DES PDF AVEC DELPHI ET PDF CREATOR
Source avec Zip Source avec une capture DESIGN PATTERN OBSERVER : IMPLÉMENTATION RÉUTILISABLE
Source avec Zip DESIGN PATTERN STRATÉGIE APPLIQUÉ AU CODE "JOURNAL DE DÉBUGG...
Source avec Zip Source avec une capture DESSINER UN RECTANGLE DE SÉLECTION AU DESSUS D'AUTRES COMPOS...

 Sources de la même categorie

Source avec Zip Source avec une capture GESTION DE L'ACCÈS AU MDICHILD À L'AIDE D'ONGLET par CricriLeFou
MAILS AVEC INDY10 : CONTENTTYPE/CONTENTID/PARENTPART par MAURICIO
Source avec Zip Source avec une capture LES CODES DU TUTORIEL SUR LA PROTECTION DES LOGICIELS PAR FI... par Paounet
Source avec Zip Source avec une capture DESIGN PATTERN OBSERVER : IMPLÉMENTATION RÉUTILISABLE par Delphiprog
Source avec Zip Source avec une capture STEGANO - CACHER DU TEXTE DANS UNE IMAGE (TUTO) par pablor44

Commentaires et avis

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 !

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

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.

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

Commentaire de jvth le 01/05/2005 11:38:13

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

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.

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+

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

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales