Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 13 sur 13
  1. #1
    Membre confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    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 confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    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 :
    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 du Club
    Inscrit en
    mars 2003
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : mars 2003
    Messages : 125
    Points : 67
    Points
    67

    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 confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    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
    Administrateur forum

    Avatar de Nono40
    Homme Profil pro Bruno Guérangé
    Ingénieur développement logiciels
    Inscrit en
    mai 2002
    Messages
    8 413
    Détails du profil
    Informations personnelles :
    Nom : Homme Bruno Guérangé
    Âge : 47
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : mai 2002
    Messages : 8 413
    Points : 17 863
    Points
    17 863

    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 confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    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 Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 454
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 454
    Points : 4 015
    Points
    4 015

    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 ?
    L'Art est long et le Temps est court.

  8. #8
    Membre confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    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 Expert Avatar de philnext
    Inscrit en
    octobre 2002
    Messages
    1 515
    Détails du profil
    Informations forums :
    Inscription : octobre 2002
    Messages : 1 515
    Points : 1 666
    Points
    1 666

    Par défaut

    Salut,
    Pourquoi ne pas mettre tes projets en open source style sur SourceForge ou autre ?

  10. #10
    Membre confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    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 Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 454
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 454
    Points : 4 015
    Points
    4 015

    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.
    L'Art est long et le Temps est court.

  12. #12
    Membre confirmé
    Homme Profil pro Guy Tessier
    Enseignant
    Inscrit en
    mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Nom : Homme Guy Tessier
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2012
    Messages : 164
    Points : 292
    Points
    292

    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 Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 454
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 454
    Points : 4 015
    Points
    4 015

    Par défaut

    Merci, je vais regarder ça.
    L'Art est long et le Temps est court.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •