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

Compteur Digital et Actions utilisateur

Écrit en Lazarus 3.6, testé sur Windows. Ne devrait pas poser de problème pour l'adapter en Free Pascal ou Delphi.
C'est un compteur digital, avec ses fonctions classiques permettant d'interrompre le comptage précis à tout moment, de le reprendre ou de le réinitialiser.
1. Affichage digital d'un compteur avec des images pour les digits.
2. Un comptage du temps de rafraîchissement de l'affichage est précis et utilise l'horloge interne.
3. Les commandes Start, Pause et Stop sont basées sur une gestion des interruptions du compteur : la solution choisie est Application.ProcessMessages dans la boucle de temporisation pour permettre à l'application de rester réactive.
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 20/02/2025 à 18:11
La nouvelle version fonctionne parfaitement.

Sans vouloir négliger les remarques fort instructives d'Andnotor (que j'ai au contraire lues avec attention), je vous propose une version conçue de la façon que j'ai dite précédemment, ce qui permettra peut-être d'en voir les avantages et les inconvénients. L'avantage, c'est que j'ai pu supprimer bon nombre de variables et d'instructions !
Avatar de Jlmat
Membre averti https://www.developpez.com
Le 03/02/2025 à 23:14
Bonjour,

Je vous propose un nouvel élément à utiliser : Compteur Digital et Actions utilisateur

Écrit en Lazarus 3.6, testé sur Windows. Ne devrait pas poser de problème pour l'adapter en Free Pascal ou Delphi.



C'est un compteur Digital avec ses fonctions classiques permettant d'interrompre le comptage précis à tout moment, de le reprendre ou de le réinitialiser.
1. Affichage digital d'un compteur avec des images pour les digits.
2. Un comptage du temps de rafraichissement de l'affichage est précis et utilise l'horloge interne.
3. Les commandes start, Pause et Stop sont basées sur une gestion des interruptions du compteur : La solution choisie est Application.ProcessMessages dans la boucle de temporisation pour permettre à l'application de rester réactive.

Qu'en pensez-vous ?
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 15/02/2025 à 11:24
Pas de quoi.

Il n'y a rien de particulier à faire pour qu'une application Lazarus soit multiplatforme. Il suffit de ne pas utiliser l'unité Windows !

Nous attendons avec impatience la version avec thread !
Avatar de Jlmat
Membre averti https://www.developpez.com
Le 17/02/2025 à 19:33
Citation Envoyé par Roland Chastain Voir le message
... pour ma part je n'aime pas utiliser Application.ProcessMessages. Ça peut dépanner mais c'est toujours le signe (me semble-t-il) que le programme n'est pas bien conçu.

Pourquoi ne pas conserver la première version du programme dans un dossier séparé ? Enfin, c'est ce que j'aurais fait. En tout cas j'ai hâte de voir la nouvelle version.
Bonsoir,

Oui, c'est le premier réflexe que j'ai eu de séparer les deux méthodes, c'était évidemment plus simple... Mais je trouve intéressant cette interaction qu'il y a entre les deux solutions, ça oblige à réfléchir sur le niveau de la couche logicielle. Bah je crois que je suis un peu fou d'aller sur ce niveau, j'ai autre chose à faire. Je pense que cela vient du fait que les mêmes fonctions et commandes sont les mêmes pour les deux processus... Ils n'aiment pas se passer la main l'un après l'autre après une pause... Je vais voir, je peux séparer les commandes, ça devrait résoudre le problème.

je n'aime pas utiliser Application.ProcessMessages
Bah, je suis de la vieille école où l'on était heureux d'avoir ce ProcessMessage. Sans doute, il est plus simple à mettre en place. J'ai toujours eu quelques difficultés avec le multithread, non pas pour un seul processus comme ce compteur, mais lorsque plusieurs tâches différentes sont en Jeu. Le code devient plus conséquent, mais je vais en avoir besoin je pense de m'y replonger. J'ai d'ailleurs un exemple pédagogique que j'avais fait à l'époque avec delphi 7...

Bon, je me posais la question comment on fait pour modifier un code déjà posté? En accédant à mon source, je ne vois pas d'option de modification ou mise à jour!
Sinon, je pourrais poster ma version Thread uniquement comme nouveau code. Je vais vous le soumettre ici en attendant dans une version épurée vite fait. Je n'ai pas enlevé le traçage qui m'aidait à débugger : [ATTACH]664607d1/a/a/a" />

A+
Avatar de Alcatîz
Responsable Pascal, Lazarus et Assembleur https://www.developpez.com
Le 18/02/2025 à 8:18
Bonjour,

Citation Envoyé par Jlmat Voir le message
Bon, je me posais la question comment on fait pour modifier un code déjà posté? En accédant à mon source, je ne vois pas d'option de modification ou mise à jour!
Sinon, je pourrais poster ma version Thread uniquement comme nouveau code. Je vais vous le soumettre ici en attendant dans une version épurée vite fait.
J'ai édité la fiche de téléchargement pour proposer les deux versions.
Avatar de Andnotor
Rédacteur/Modérateur https://www.developpez.com
Le 18/02/2025 à 9:53
Citation Envoyé par Roland Chastain Voir le message
Normalement vous ne devriez pas modifier directement Form1 depuis TCompteurThread, comme ici par exemple :

Code : Sélectionner tout
1
2
3
procedure TCompteurThread.StartCounter;
begin
  Form1.Memo1.Append('THR: StartCounter appelé et compteur repris');
Ici en l'occurrence ça ne pose pas de problème puisque cette méthode est appelée depuis la tâche principale. Il ne faut pas confondre l'objet TThread, simple objet comme tous les autres, et sa méthode Execute qui est effectivement la tâche secondaire.
Ce sont les accès depuis Execute (ou les méthodes invoquées depuis cette dernière) qui doivent absolument être synchronisés d'une façon ou d'une autre.

Citation Envoyé par Roland Chastain Voir le message
À mon avis (mais je peux me tromper, et ça se discute), les méthodes StartCounter, PauseCounter et ResetCounter ne devraient pas faire partie de la classe TCompteurThread, et même elles ne devraient pas exister du tout.
Ca se discute en effet mais le faire ainsi rend le code beaucoup plus portable. Réutiliser cet objet dans une autre app se ferait sans se poser de question ; on appelle Start/Stop/Pause

Citation Envoyé par Roland Chastain Voir le message
Personnellement je créerais le thread pour commencer à compter, et je le terminerais et le libérerais en cas de pause. Avoir un thread actif pour ne rien faire, à quoi bon ?
Ca se discute une nouvelle fois.

Ici c'est la base de l'application et sans lui elle ne sert à rien, je l'aurais même créé une fois pour toute au lancement de l'app. Il en serait autrement (et encore) pour une tâche de mise à jour invoquée sporadiquement.

Ce qui ne va pas est la façon dont ce thread est "soi-disant" mis en pause ; dans les faits il ne l'est pas puisqu'il travaille toutes les 50 ms. Il faut remplacer cette logique par une véritable fonction d'attente telle que TEvent. Un thread correctement mis en attente ne consomme plus aucun temps CPU puisqu'il n'est plus planifié par l'OS. Pour reprendre ton terme : il existe mais n'est plus actif
Avatar de Jlmat
Membre averti https://www.developpez.com
Le 18/02/2025 à 16:03
Bonjour à tous,

:mouarf: Quelle horreur ce VIP sous notre Avatar! Enfin, c'est pour la bonne cause, plus petit ou discret aurait pas été plus mal...

1. Comme je l'ai dit à Roland, j'ai épuré mon code de test pour lui donner la version extraite rapidement de la solution Thread qui était encore en test dans un autre contexte de code.
Il est bien sûr évident que l'instruction "Form1.Memo1.Append..." n'était là que temporairement pour les tests qui étaient en cours.

2. Par contre effectivement, je développe des exemples que j'essaye de rendre portable au mieux de mes possibilités et je rejoint Andnotor sur le fait de développer une classe spécifique qu_e je transforme en une unité qui s'enrichira au fur et à mesure des besoins, avec par exemple plusieurs formats de sortie etc.
mais je rejoins aussi Roland lorsqu'il dit que l'on pourrait se passer des méthodes StartCounter, PauseCounter et ResetCounter. Je vais voir si je peux développer une autre version du Thread plus légère...

3. Finalement, j'avais pensé présenté les deux méthodes l'une à côté de l'autre tout en étant indépendantes. Dans certains cas, la méthode ProcessMessage est encore utile lorsque par exemple une propriété (ou un évènement) n'est pas disponible dans la version d'un contrôle, on peut toujours intercepter le message de l'application par les constantes de FCP, Winndows, RTL etc...

Bon, si je comprends vos messages, vous préférez que je publie la version Thread séparément?

A+
Avatar de Jlmat
Membre averti https://www.developpez.com
Le 19/02/2025 à 20:14
Bonsoir,

Je vous donne ici la version minimale du Thread pour le compteur. Je crois que c'était ce que Roland me demandait depuis le début : [ATTACH]664682d1/a/a/a" />.

Je pense que je vais avoir besoin d'un Thread plus sophistiqué pour gérer d'éventuels conflits sur un même contrôle (en l'occurence ici, un compteur à affichage digital).
Par exemple, un compteur qui relèverait des anomalies en provenance de différents systèmes, chercherait à incrémenter le compteur en même temps et certaines demandes en provenance d'autres processus pourraient se fondre ou être perdus car le compteur est déjà sollicité et être en train de mettre à jour le compteur.

Je vais donc écrire et publier j'espère une version multithread dans des interactions diverses entre le simple Thread (donné ci-dessus) et un thread plus élaboré sous forme de classe transportable dans une unité dédiée. Je la mettrais sur ce forum pour me dire ce que vous en pensez avant de le publier.

A+
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 13/02/2025 à 9:48
Bonjour !

Merci pour le partage.

Dommage que ce soit pour Windows seulement. Du coup je ne peux pas l'essayer.

Le programme qui s'exécute dans la procédure liée au clic du bouton, d'accord ça fonctionne, mais bon... L'exemple serait plus intéressant (à mon humble avis, et si je peux me permettre) avec un thread, comme vous l'indiquez vous-même en commentaire. En plus, ce n'est pas difficile à faire.

Il y a une unité dans le ZIP qui ne fait pas partie du projet.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.