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

Contribuez Delphi Discussion :

Intérêt pour un Timer précision 1 ms et un ComPort?


Sujet :

Contribuez Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut Intérêt pour un Timer précision 1 ms et un ComPort?
    Bonjour,

    J'ai proposé sur le forum de C++ Builder deux composants, un Timer avec une résolution de 1 milliseconde et un Comport (communication sériel) que j'ai écrit en C++. Il s'agit de composants que j'utilise depuis des années avec mes étudiants (j'enseigne la programmation des systèmes embarqués).

    http://www.developpez.net/forums/f15...r/telechargez/

    S'il y a de l'intérêt, ça me fera plaisir de les réécrire en Delphi. En fait, j'ai travaillé longtemps avec Delphi (les premières versions de mes composants étaient en Delphi), alors ça devrait pas être trop difficile de m'y remettre.

    Un ex-delphieur.

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut
    Bon bin, je vois bien qu'il n'y a pas d'intérêt, mais ce n'est pas bien grave, j'ai lu le mythe de Sisyphe.

    Histoire de voir si j'ai pas perdu la main, j'ai quand même réécrit TMMTimer en Delphi. J'avais oublié comment tout était plus simple en Delphi.

    De tout façon, ce n'était pas trop long à faire, après tout, ce timer n'est rien d'autre que l'encapsulation de deux petites fonctions de l'API multi média de Windows. Je vous balance le code, au cazou.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    {
    ================================================================================
    Composant TMMTimer pour Delphi
    Guy Tessier (Guyt), guyt54@gmail.com
    dernière revision: 2012/03/24
     
    Compilé avec XE2, testé en Windows 7.
    Fontionnera surement jusqu'à Delphi 1 en XP  (et peut-être Windows 3.1)
     
    peut-être faudra-t-il changer les noms dans "uses"
     
    Équivalent au "TTimer", mais avec une précision de 1 ms (au lieu de 50 ms)
    Utilise les fonctions multimédia.
    ================================================================================
    }
     
    unit MMTimer;
     
    interface
     
    uses  // en XE2
      MMSystem, Winapi.Windows,System.SysUtils, System.Classes;
     
    { probablement pour versions antérieures
    uses
       MMSystem, Windows, SysUtils,Classes;
    }
     
    type
      TMMTimer = class(TComponent)
      private
        fTimerID : integer ;
        fOpened : boolean ;
        fInterval : integer ;
        fEnabled : boolean ;
        fOnTimer : TNotifyEvent ;
     
        procedure Open ;
        procedure Close ;
        procedure SetEnabled(Enabled:boolean) ;
        procedure SetInterval(Interval:integer) ;
      protected
        { Déclarations protégées }
      public
        { Déclarations publiques }
        constructor Create(aOwner:TComponent) ; override ;
        destructor Destroy ; override ;
      published
        { Déclarations publiées }
        property Enabled:boolean read fEnabled write SetEnabled default false ;
        property Interval:integer read fInterval write SetInterval default 1000 ;
        property OnTimer:TNotifyEvent read fOnTimer write fOnTimer ;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Guyt', [TMMTimer]);
    end;
     
    // ===========================
    // Constructeur et destructeur
    // ===========================
     
    constructor TMMTimer.Create(aOwner:TComponent) ;
     
    begin
      inherited Create(aOwner) ;
      fInterval := 1000 ;
      fEnabled := false ;
      fOnTimer := nil ;
    end ;
     
    destructor TMMTimer.Destroy ;
     
    begin
      Close() ;
      inherited Destroy ;
    end ;
     
    // ================
    // Méthodes privées
    // ================
     
    procedure TMMTimerCallBackProc(uTimerID,uMessage,dwUser,dw1,dw2: DWORD) ; stdcall;
    // stdcall delphi call badk functions
    // dwUser contient l'adresse de l'instance de TNewTimer
     
    var Timer : TMMTimer ;
     
    begin
      timer := TMMTimer(dwUser) ;
      if Assigned(timer.fOnTimer) then
        timer.fOnTimer(timer) ;
    end ;
     
    procedure TMMTimer.Open ;
    begin
       Close() ;
       fTimerID := timeSetEvent(fInterval,0,@TMMTimerCallBackProc,
                                DWORD(self),TIME_PERIODIC);
       fOpened := (fTimerID <> 0) ;
    end ;
     
    procedure TMMTimer.Close ;
    begin
       if (fOpened) then
        begin
          fOpened := false ;
          timeKillEvent(fTimerID);
        end;
    end;
     
    procedure TMMTimer.SetEnabled(Enabled:boolean) ;
     
    begin
      fEnabled := Enabled ;
      Close() ;
      if fEnabled then Open ;
    end ;
     
    procedure TMMTimer.SetInterval(Interval:integer) ;
     
    begin
      fInterval := Interval ;
      if fEnabled then
        begin
          Close ;
          Open ;
        end ;
    end ;
     
    end.

    Au plaisir!

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 162
    Points : 124
    Points
    124
    Par défaut
    Personnellement, je serais intéressé par le comport en Delphi, s'il ne s'agit pas d'un composant visuel. En effet, j'utilise Async32 de TMS, qui marche très bien,
    mais j'aimerais pouvoir m'en servir dans une DLL.
    Je suis bien incapable d'écrire un tel composant, et j'espère ne pas être le seul dans ce contexte !
    Pour le timer, j'utilise la fonction API gettickcount, mais je n'ai pas besoin d'une telle résolution.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par Teddy Voir le message
    Personnellement, je serais intéressé par le comport en Delphi, s'il ne s'agit pas d'un composant visuel. En effet, j'utilise Async32 de TMS, qui marche très bien,
    mais j'aimerais pouvoir m'en servir dans une DLL.
    Je suis bien incapable d'écrire un tel composant, et j'espère ne pas être le seul dans ce contexte !
    Pour le timer, j'utilise la fonction API gettickcount, mais je n'ai pas besoin d'une telle résolution.
    Bof, tu sais, c'est pas si compliqué à faire, de la communication sérielle sous Windows, c'est essentiellement du traitement de fichier. Remarque, je préférais la glorieuse époque où on programmait directement le USART (un 8259, si je me souviens bien). Je trouve ça rigolo de voir que des registres de 8 bits ont fini par se transformer en fichiers avec les années.

    Merci d'avoir pris le temps de me répondre.

    Au plaisir!

  5. #5
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Citation Envoyé par Guyt54 Voir le message
    Remarque, je préférais la glorieuse époque où on programmait directement le USART (un 8259, si je me souviens bien). Je trouve ça rigolo de voir que des registres de 8 bits ont fini par se transformer en fichiers avec les années.
    Oui c'était amusant mais pas forcément aussi fiable que d'utiliser OpenFile. Windows 2000 à tué cette méthode de toute façon, l'accès direct aux ports E/S étant devenues (à raison) des instructions privilégiées.
    L'avantage de OpenFile est que ce n'est pas forcément un 'vrai' port série, ça peut être un convertisseur USB/Série aussi bien qu'un pont vers Ethernet.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Oui c'était amusant mais pas forcément aussi fiable que d'utiliser OpenFile. Windows 2000 à tué cette méthode de toute façon, l'accès direct aux ports E/S étant devenues (à raison) des instructions privilégiées.
    L'avantage de OpenFile est que ce n'est pas forcément un 'vrai' port série, ça peut être un convertisseur USB/Série aussi bien qu'un pont vers Ethernet.
    Ah, ces chers convertisseurs USB à sériel! Je te dis pas l'immense soulagement que j'ai eu quand je les ai vu apparaitre ceux-là! Dans le monde dans lequel je travaille (microcontrôleurs) du RS-232C, en a encore en masse et c'était très inquiétant de voir les vrais ports RS-232C disparaitre.

    Reste tout de même qu'on a perdu en efficacité avec tout ça, surtout quand on travaille sur une base d'octets. Par exemple, dans mon ComPort, j'ai un événement "OnRxChars" qui va être lancé beaucoup plus rapidement à la réception d'un caractère avec un véritable port sériel. Je m'étais intéressé pas mal à cette question il y a quelques années. Il y avait des façons d'optimaliser le driver usb-sériel, mais reste quand même que le vrai port était au moins 2 fois plus rapide à déclancher l'événement.

    Au plaisir!

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Guyt54 Voir le message
    Histoire de voir si j'ai pas perdu la main, j'ai quand même réécrit TMMTimer en Delphi. J'avais oublié comment tout était plus simple en Delphi.

    De tout façon, ce n'était pas trop long à faire, après tout, ce timer n'est rien d'autre que l'encapsulation de deux petites fonctions de l'API multi média de Windows. Je vous balance le code, au cazou.
    Bonjour !

    Pourrais-tu donner un petit exemple d'utilisation ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour !

    Pourrais-tu donner un petit exemple d'utilisation ?
    Désolé pour le délai, j'avais pas vu la question.

    Je ne suis pas certain du sens de ta question, alors je vais te donner deux réponses!

    Comment s'en servir?

    En terme de fonctionnement, Le MMTimer est identique à celui du TTimer, avec les mêmes propriétés (Enabled et Interval) et événement (OnTimer).

    La petite nuance est que "Enabled" est à "false" par défaut et que la précision est de 1 ms (ah oui, l'icône est différent!)


    À quoi ça peut servir?

    La précision de 50 ms du timer original est amplement suffisante dans la très grande majorité des cas.

    Les seuls fois jusqu'à présent où j'ai eu besoin de plus de précision, c'était pour faire du travail en arrière plan (l'équivalent d'un thread) pour vérifier si des données avaient été reçues (pour un COM port et un UDP port) et déclencher un événement.

    En fait, les threads, j'ai pas mal éliminé ça de mon code pour remplacer ça par un événement de Timer. Je trouve ça moins lourd, probablement plus rapide et le gros avantage, c'est qu'on a pas besoin de se synchroniser avec l'interface utilisateur.

    J'espère que ça répond à ta question.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Salut,
    Pourquoi ne pas mettre tes projets en open source style sur SourceForge ou autre ?

  10. #10
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par philnext Voir le message
    Salut,
    Pourquoi ne pas mettre tes projets en open source style sur SourceForge ou autre ?
    Bin, j'ai fait une étude de marché et finalement, y a pas beaucoup d'intérêt pour mes petits composants. alors mieux vaut garder le flop confidentiel.

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Guyt54 Voir le message
    Désolé pour le délai, j'avais pas vu la question.
    Merci pour ta réponse, que je viens juste de voir !

    Citation Envoyé par Guyt54 Voir le message
    Je ne suis pas certain du sens de ta question, alors je vais te donner deux réponses!
    C'est vrai que ma question était ambiguë. En fait, je te demandais un exemple de code. Je découvre Delphi, et je cherche à faire provision d'exemples de code. Soit dit en passant, ce n'est pas facile. Les discussions du forum ont presque toujours un caractère ésotérique. "J'ai essayé de mettre un TMachin dans un TTruc... Impossible ! — A quoi pensais-tu ? Il fallait mettre un TBidule." C'est un langage réservé aux initiés.

    Citation Envoyé par Guyt54 Voir le message
    En terme de fonctionnement, Le MMTimer est identique à celui du TTimer, avec les mêmes propriétés (Enabled et Interval) et événement (OnTimer).
    C'est noté.

    Citation Envoyé par Guyt54 Voir le message
    J'espère que ça répond à ta question.
    J'écris un programme d'échecs (sous Turbo Pascal, mais avec l'intention de passer à Delphi le moment venu). Je rencontre donc des problèmes d'économie de temps. Je pense qu'un chronomètre pourrait me servir à améliorer mon programme, en me permettant de savoir si une écriture est plus lente ou plus rapide qu'une autre.

    Ce que tu dis sur les "threads" m'intéresse bien aussi. Si je comprends bien, un chronomètre bien utilisé peut rendre les mêmes services qu'un "thread". Par exemple, si je veux que mon programme profite du temps de réflexion de l'utilisateur pour faire des calculs, je peux écrire une condition du genre : "tous les quarts de seconde, vérifier si l'utilisateur n'a pas appuyé sur une touche". C'est ça, non ?


    P.-S. Un autre exemple de chronomètre sous Delphi XE2 proposé dans le forum.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  12. #12
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Points : 356
    Points
    356
    Par défaut
    Bonjour Roland,

    Regarde ce vidéo, c'est bien fait:



    Le plus difficile pour toi pour va être de penser "événementiel" plutôt que "séquentiel". Par exemple, en Delphi, y a pas de programme principal (ok, y en a un mais on y touche pas). Un programme en Delphi, ça fait rien, ça attend un événement et ça réagit.

    Ce n'est plus le programmeur qui dicte l'ordre des choses par une suite d'énoncés séquentielles, c'est l'utilisateur qui décide, à toi de réagir à ses ordres lorsqu'il aura appuyé sur un bouton, cliquez sur une cellule de grille...

    Mais tu vas voir, ce n'est pas si sorcier un coup que tu auras compris les notions de propriétés, événement et méthodes associées aux objets.

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Merci, je vais regarder ça.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. quel intérêt pour utiliser l'encodage (ex: Manchester)
    Par SOA_j2EE dans le forum Développement
    Réponses: 1
    Dernier message: 03/09/2009, 09h31
  2. un listener pour mon timer
    Par schwarzy2 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 11/06/2007, 16h53
  3. Quelle solution pour un Timer ?
    Par Bruno13 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 06/03/2006, 17h01
  4. Disque dur flash : intérêt pour un portable ?
    Par Neilos dans le forum Composants
    Réponses: 6
    Dernier message: 24/02/2006, 08h54

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