Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources et autres ressources pour la rubrique Delphi.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/03/2012, 03h32   #1
Guyt54
Membre confirmé
 
Homme Guy Tessier
Enseignant
Inscription : 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 : 299
Points : 299
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.
Guyt54 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/03/2012, 12h22   #2
Guyt54
Membre confirmé
 
Homme Guy Tessier
Enseignant
Inscription : 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 : 299
Points : 299
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!
Guyt54 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/03/2012, 18h52   #3
Teddy
Membre du Club
 
Inscription : mars 2003
Messages : 90
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 90
Points : 46
Points : 46
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.
Teddy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2012, 03h12   #4
Guyt54
Membre confirmé
 
Homme Guy Tessier
Enseignant
Inscription : 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 : 299
Points : 299
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!
Guyt54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2012, 12h31   #5
Nono40
Responsable outils internes

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

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

Informations forums :
Inscription : mai 2002
Messages : 8 217
Points : 15 475
Points : 15 475
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 !
Nono40 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/03/2012, 17h17   #6
Guyt54
Membre confirmé
 
Homme Guy Tessier
Enseignant
Inscription : 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 : 299
Points : 299
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!
Guyt54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2012, 04h13   #7
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 689
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 689
Points : 1 005
Points : 1 005
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.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2012, 15h54   #8
Guyt54
Membre confirmé
 
Homme Guy Tessier
Enseignant
Inscription : 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 : 299
Points : 299
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.
Guyt54 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2012, 20h36   #9
philnext
Membre Expert
 
Inscription : octobre 2002
Messages : 1 503
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 1 503
Points : 1 475
Points : 1 475
Salut,
Pourquoi ne pas mettre tes projets en open source style sur SourceForge ou autre ?
philnext est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2012, 21h43   #10
Guyt54
Membre confirmé
 
Homme Guy Tessier
Enseignant
Inscription : 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 : 299
Points : 299
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.
Guyt54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2012, 04h15   #11
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 689
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 689
Points : 1 005
Points : 1 005
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.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2012, 19h50   #12
Guyt54
Membre confirmé
 
Homme Guy Tessier
Enseignant
Inscription : 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 : 299
Points : 299
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.
Guyt54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2012, 21h00   #13
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 689
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 689
Points : 1 005
Points : 1 005
Merci, je vais regarder ça.
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h40.


 
 
 
 
Partenaires

Hébergement Web