IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Utilisation de timer


Sujet :

Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 52
    Par défaut Utilisation de timer
    on veut faire un programme où on utilise une horloge comment utiliser un objet timer pour incrémenter cette horloge en temps réel .

  2. #2
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 187
    Par défaut
    ça marche aussi en deposant un Ttimer sur ta fiche et en cliquant sur F1 par la suite

  4. #4
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    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+.

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    :
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Citation Envoyé par Gilbert Geyer
    Pour une précision plus serrée j'ai lu quelque part
    Peut-être dans la http://delphi.developpez.com/faq/?pa...ometrageprecis

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    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.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    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'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    merci de votre aide

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    ... 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.
    A+
    P.S : Précision / vocabulaire ne pas confondre "Timer" (peu fiable cars très approximatif) avec "Chrono" le cChrono utilise le compteur hautes performances.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    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.

  11. #11
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    Par défaut
    Slt , si tu veux faire une horloge en utilisant un timer alors:



    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Timer1.Interval:=1000;
    Timer1.Enabled:=true;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    Edit1.Text:=TimeToStr(now);
    end;

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    merci pour ces réponses j evais voir si je m en sors dans les declarations...

Discussions similaires

  1. utilisation des timers
    Par iwio dans le forum Allegro
    Réponses: 1
    Dernier message: 25/06/2006, 23h55
  2. Utilisation de Timer dans Python
    Par aliassaf dans le forum Général Python
    Réponses: 5
    Dernier message: 17/06/2006, 19h06
  3. [C#.net] utiliser un timer
    Par Mandalar dans le forum DirectX
    Réponses: 4
    Dernier message: 26/01/2006, 22h17
  4. Utiliser un timer dans une application console
    Par chavers dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2005, 14h07
  5. Utilisation de Timer
    Par Freakazoid dans le forum DirectX
    Réponses: 1
    Dernier message: 07/07/2004, 23h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo