FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Problème de math
par papydall Aujourd'hui à 1:53

» A propos des attributs de fichier
par papydall Hier à 14:33

» Problème de math
par Marc37 Sam 21 Oct 2017 - 23:04

» I Love You
par papydall Sam 21 Oct 2017 - 19:22

» Un petit "coucou" à tous les Panoramiciens !
par mindstorm Sam 21 Oct 2017 - 17:06

» MARK_ON déclenche un événement ON_CLICK à la place de ...
par Jean Claude Mer 18 Oct 2017 - 18:08

» mise a jour calculatrice
par joeeee2017 Mer 18 Oct 2017 - 15:57

» [solved] 3D_LINE How to ?
par Jicehel Mer 18 Oct 2017 - 11:01

» Convertisseur de base 10 de 2 à 36
par gigi75 Mar 17 Oct 2017 - 18:49

» calculatrice avec touches movibles
par joeeee2017 Dim 15 Oct 2017 - 1:11

» CORTANA
par gigi75 Sam 14 Oct 2017 - 16:32

» Calculatrice
par Jean Claude Sam 14 Oct 2017 - 12:30

» Compilateur FBPano
par jean_debord Jeu 12 Oct 2017 - 9:53

» KGF_dll - nouvelles versions
par Klaus Mar 10 Oct 2017 - 18:49

» à propos de Panoramic_Editor [Résolu]
par Klaus Mar 10 Oct 2017 - 3:19

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Octobre 2017
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 Chronomètre

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Marc37



Nombre de messages : 457
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Chronomètre   Dim 11 Oct 2015 - 20:15

Bonjour à tous,

Je viens de réaliser un petit chronomètre :



Un problème subsiste : il n'est pas très précis !
C'est un comble pour un "chronomètre" !
J'ai utilisé un TIMER qui, en fonction de l'activité de Windows, peut prendre du retard.
Code:
DIM Compteur%, Heures%, Minutes%, Secondes%, dixiemes%, Still%, Couleur%, a
DIM HH$, MM$, SS$, CC$
DIM Affichage$

LABEL Bouton_Start, Bouton_Pause, Bouton_Stop, Bouton_Raz, Changement_Couleur, Comptage

WIDTH 0, 420
   HEIGHT 0, 191
   COLOR 0, 0,0,0
   FONT_NAME 0, "arial"
   FONT_SIZE 0, 14

BUTTON 1
   TOP 1, 100
   LEFT 1, 2
   WIDTH 1, 100
   HEIGHT 1, 50
   CAPTION 1, START
  
BUTTON 2
   TOP 2, 100
   LEFT 2, 102
   WIDTH 2, 100
   HEIGHT 2, 50
   CAPTION 2, PAUSE

BUTTON 3
   TOP 3, 100
   LEFT 3, 202
   WIDTH 3, 100
   HEIGHT 3, 50
   CAPTION 3, STOP
  
BUTTON 4
   TOP 4, 100
   LEFT 4, 302
   WIDTH 4, 100
   HEIGHT 4, 50
   CAPTION 4, R.A.Z
  
ALPHA 5
   TOP 5, 14
   LEFT 5, 48
   WIDTH 5, 380
   HEIGHT 5, 80
   FONT_SIZE 5, 48
   FONT_COLOR 5, 255,0,0
   CAPTION 5, "00:00:00,0"

TIMER 6
   TIMER_INTERVAL 6, 100
   TIMER_OFF 6
   ON_TIMER 6, Comptage

Couleur% = 1

ON_CLICK 1, Bouton_Start
ON_CLICK 2, Bouton_Pause
ON_CLICK 3, Bouton_Stop
ON_CLICK 4, Bouton_Raz
ON_CLICK 5, Changement_Couleur

END
' ------------------------------------------------------------------------------
Bouton_Start:
   TIMER_ON 6
   STILL%=0
RETURN
' ------------------------------------------------------------------------------
Bouton_Pause:
   STILL%=1
RETURN
' ------------------------------------------------------------------------------
Bouton_Stop:
   TIMER_OFF 6
RETURN
' ------------------------------------------------------------------------------
Bouton_Raz:
   TIMER_OFF 6
   Compteur% = 0
   CAPTION 5, "00:00:00,0"
RETURN
' ------------------------------------------------------------------------------
Changement_Couleur:
   Couleur% = Couleur% + 1
   IF Couleur% = 7 THEN Couleur% = 1
   If couleur% = 1 THEN FONT_COLOR 5, 255,0,0
   If couleur% = 2 THEN FONT_COLOR 5, 0,255,0
   If couleur% = 3 THEN FONT_COLOR 5, 0,0,255
   If couleur% = 4 THEN FONT_COLOR 5, 0,255,255
   If couleur% = 5 THEN FONT_COLOR 5, 255,0,255
   If couleur% = 6 THEN FONT_COLOR 5, 255,255,0
RETURN
' ------------------------------------------------------------------------------
Comptage:
   Compteur%=Compteur%+1
   IF Compteur% = 8619999 THEN Timer_OFF 6
   IF Still%=0
      dixiemes% = INT(FRAC(Compteur%/10)*10)
      CC$=STR$(dixiemes%)
      a=(compteur%-dixiemes%)/10
      Heures%=INT(a/3600)
      IF Heures% < 10 THEN HH$="0"+STR$(Heures%): ELSE : HH$=STR$(Heures%)
      a=a-(heures%*3600)
      Minutes%=INT(a/60)
      IF Minutes% < 10 THEN MM$="0"+STR$(Minutes%): ELSE : MM$=STR$(Minutes%)
      a=a-(Minutes%*60)
      Secondes%=a
      IF Secondes% < 10 THEN SS$="0"+STR$(Secondes%): ELSE : SS$=STR$(Secondes%)
      CAPTION 5, HH$ + ":"  + MM$ + ":" + SS$ + "," + CC$
   END_IF
RETURN

Hormis TIME$, Je n'ai pas trouvé d'instruction en Panoramic qui pouvait accèder à l'horloge RTC du PC avec une précision de l'ordre du centième voire millième de seconde.
Avez-vous des suggestions ?

Vous pouvez cliquer sur l'afficheur pour changer sa couleur.


Dernière édition par Marc37 le Mer 14 Oct 2015 - 1:35, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5040
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Chronomètre   Dim 11 Oct 2015 - 20:58

A part WAIT N où N est le nombre de millisecondes de délai, je ne vois rien d'autre.
Mais c'est sur que demander d'attendre à chronomètre, ce n'est pas cohérent.

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pascal10000

avatar

Nombre de messages : 536
Localisation : Troyes
Date d'inscription : 05/02/2011

MessageSujet: Re: Chronomètre   Dim 11 Oct 2015 - 21:11

à la ligne 99, 100 et 101 j'ai mis  ça et c un peut plus régulier mais a savoir si les secondes
sont précis
il faut réglé timer_interval a 89 1 seconde precis
100 a 5 seconde d'écard

   '  dixiemes% = INT(FRAC(Compteur%/10)*10) :> ligne a suprimer
     dixiemes% =dixiemes% +1
     if dixiemes%=10 then dixiemes%=0
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 466
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: Chronomètre   Dim 11 Oct 2015 - 21:34

Salut,

une mesure de temps en millisecondes :
Code:

dim result%
dll_on "kernel32"

result%=dll_call0("GetTickCount")
print "il y a ",result%," millisecondes écoulées dpuis l'allumage du PC"

dll_off
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pascal10000

avatar

Nombre de messages : 536
Localisation : Troyes
Date d'inscription : 05/02/2011

MessageSujet: Re: Chronomètre   Dim 11 Oct 2015 - 23:45

silverman
c'est sympas ton p'tit truc mais vas
convertir 11815359 en seconde !!!!!!!!!!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5040
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Chronomètre   Lun 12 Oct 2015 - 8:24

@Pascal1000,
Comme il s'agit de millisecondes c'est on ne peut plus simple:
11815359Ms=11815,359 Secondes

Pour les minutes  11815/60 = 196,9166666666667
Pour les heures 196/60 = 3,266666666666667

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Marc37



Nombre de messages : 457
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Chronomètre   Lun 12 Oct 2015 - 14:23

Chers Amis, merci de m'avoir répondu.
Suite à vos suggestions, je mènerai différents tests
le weekend prochain.
Je ne manquerai pas de vous informer de mon avancée.
Bonne semaine à tous !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 466
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: Chronomètre   Lun 12 Oct 2015 - 18:52

Exemple de conversion en : jours,heures,minutes,secondes,millisecondes
Code:

dim x,result%
dll_on "kernel32"

result%=dll_call0("GetTickCount")
print "il y a ",result%," millisecondes écoulées dpuis l'allumage du PC soit :"

dll_off

x=result%

print
x=x/(24*60*60*1000)
print int(x)," jour(s)"

x=(frac(x)*24)
print int(x)," heure(s)"

x=(frac(x)*60)
print int(x)," minute(s)"

x=(frac(x)*60)
print int(x)," seconde(s)"

x=(frac(x)*1000)
print int(x)," milliseconde(s)"
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5551
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Chronomètre   Lun 12 Oct 2015 - 21:01

Si ça peut s'avérer utile ...

Code:

rem ============================================================================
dim result%,j,h,m,s,ms,jour$,heur$,minut$,second$,msec$,t$,dat$,tim$
width 0,600 : height 0,250
alpha 10 : top 10,10 : left 10,10 : font_bold 10 : font_size 10,24
caption 0,"<CLICK> pour terminer ...."
dll_on "kernel32"

repeat
   t$ = " Nous sommes le : " + date$ +chr$(13)
   t$ = t$ + "    Il est : " + time$ + chr$(13)
   t$ = t$ + "    Votre PC est allumé depuis :" + chr$(13)

   result% = dll_call0("GetTickCount")
   j = result% / (24*60*60*1000)
   h = frac(j)*24
   m = frac(h)*60
   s = frac(m)*60
   ms = frac(s)*1000

   jour$   = str$(int(j)) : while len(jour$)   < 2 : jour$   = "0" + jour$   : end_while
   heur$   = str$(int(h)) : while len(heur$)   < 2 : heur$   = "0" + heur$   : end_while
   minut$  = str$(int(m)) : while len(minut$)  < 2 : minut$  = "0" + minut$  : end_while
   second$ = str$(int(s)) : while len(second$) < 2 : second$ = "0" + second$ : end_while
   msec$   = str$(int(ms)): while len(msec$)   < 3 : msec$   = "0" + msec$   : end_while

   t$  = t$ +  jour$ + " j : " + heur$ + " h : " + minut$ + " m : " + second$ + " s : " + msec$ + " ms"
   caption 10,t$
until scancode <> 0
dll_off
terminate : end
rem ============================================================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Marc37



Nombre de messages : 457
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Chronomètre   Mar 13 Oct 2015 - 1:10

Bonsoir à tous,
Merci pour vos conseils et suggestions.

J'ai donc adopté comme référence de temps, non plus le déclenchement d'un TIMER - qui s'est révélé imprécis -, mais, comme vous me l'avez suggéré, la base de temps Windows avec la fonction dll_call0("GetTickCount").

Cette base de temps Windows prenant référence sur l'horloge RTC pilotée par quartz du PC, la précision est excellente.
Le TIMER ne sert plus qu'à rafraîchir l'affichage.

Voici donc la version 2 de mon chronomètre.
Code:
DIM Compteur%, Heures%, Minutes%, Secondes%, dixiemes%, Still%, Couleur%, b%, Compteur_reference%
DIM a
DIM HH$, MM$, SS$, CC$
DIM Affichage$

LABEL Bouton_Start, Bouton_Pause, Bouton_Stop, Bouton_Raz, Changement_Couleur, Comptage

Affichage_Mask()

TIMER 6
   TIMER_INTERVAL 6, 50
   TIMER_OFF 6
   ON_TIMER 6, Comptage

Couleur% = 1

dll_on "kernel32"

ON_CLICK 1, Bouton_Start
ON_CLICK 2, Bouton_Pause
ON_CLICK 3, Bouton_Stop
ON_CLICK 4, Bouton_Raz
ON_CLICK 5, Changement_Couleur

END
' ------------------------------------------------------------------------------
Bouton_Start:
   TIMER_ON 6
   Compteur_Reference% = dll_call0("GetTickCount")
   b% = Compteur_Reference%
   STILL%=0
RETURN
' ------------------------------------------------------------------------------
Bouton_Pause:
   IF STILL%=1 THEN STILL%=0 : ELSE : STILL%=1
RETURN
' ------------------------------------------------------------------------------
Bouton_Stop:
   TIMER_OFF 6
RETURN
' ------------------------------------------------------------------------------
Bouton_Raz:
   TIMER_OFF 6
   Compteur% = 0
   CAPTION 5, "00:00:00,0"
RETURN
' ------------------------------------------------------------------------------
Changement_Couleur:
   Couleur% = Couleur% + 1
   IF Couleur% = 7 THEN Couleur% = 1
   If couleur% = 1 THEN FONT_COLOR 5, 255,0,0
   If couleur% = 2 THEN FONT_COLOR 5, 0,255,0
   If couleur% = 3 THEN FONT_COLOR 5, 0,0,255
   If couleur% = 4 THEN FONT_COLOR 5, 0,255,255
   If couleur% = 5 THEN FONT_COLOR 5, 255,0,255
   If couleur% = 6 THEN FONT_COLOR 5, 255,255,0
RETURN
' ------------------------------------------------------------------------------
Comptage:
   Compteur_Reference% = dll_call0("GetTickCount")
   Compteur% = (Compteur_reference% - b%)/100
   IF Compteur% = 8619999 THEN Timer_OFF 6
   IF Still%=0
      dixiemes% = INT(FRAC(Compteur%/10)*10)
      CC$=STR$(dixiemes%)
      a=(compteur%-dixiemes%)/10
      Heures%=INT(a/3600)
      IF Heures% < 10 THEN HH$="0"+STR$(Heures%): ELSE : HH$=STR$(Heures%)
      a=a-(heures%*3600)
      Minutes%=INT(a/60)
      IF Minutes% < 10 THEN MM$="0"+STR$(Minutes%): ELSE : MM$=STR$(Minutes%)
      a=a-(Minutes%*60)
      Secondes%=a
      IF Secondes% < 10 THEN SS$="0"+STR$(Secondes%): ELSE : SS$=STR$(Secondes%)
      CAPTION 5, HH$ + ":"  + MM$ + ":" + SS$ + "," + CC$
   END_IF
RETURN
'-------------------------------------------------------------------------------
SUB Affichage_Mask()

WIDTH 0, 420
   HEIGHT 0, 191
   COLOR 0, 0,0,0
   FONT_NAME 0, "arial"
   FONT_SIZE 0, 14

BUTTON 1
   TOP 1, 100
   LEFT 1, 2
   WIDTH 1, 100
   HEIGHT 1, 50
   CAPTION 1, START

BUTTON 2
   TOP 2, 100
   LEFT 2, 102
   WIDTH 2, 100
   HEIGHT 2, 50
   CAPTION 2, PAUSE

BUTTON 3
   TOP 3, 100
   LEFT 3, 202
   WIDTH 3, 100
   HEIGHT 3, 50
   CAPTION 3, STOP

BUTTON 4
   TOP 4, 100
   LEFT 4, 302
   WIDTH 4, 100
   HEIGHT 4, 50
   CAPTION 4, R.A.Z

ALPHA 5
   TOP 5, 14
   LEFT 5, 48
   WIDTH 5, 380
   HEIGHT 5, 80
   FONT_SIZE 5, 48
   FONT_COLOR 5, 255,0,0
   CAPTION 5, "00:00:00,0"

END_SUB

Prochaine étape : gagner en fluidité, peut être en substituant le TIMER par une boucle WHILE...

A bientôt !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10075
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Chronomètre   Mar 13 Oct 2015 - 2:44

Oh, malheureux... Ne fais jamais ça ! Une boucle while pour effectuer une attente, consomme en fait du temps d'unité centrale et ne fait rien d'autre. Autant dire que tu ralentis globalement tout ton système. L'utilisation d'un timer pour le rafraichissement est la bonne solution.

Et un éventuel scintillement ne vient pas du timer, mais du réaffichage lui-même. Envisage éventuellement une solution de double tampon: crée deux jeux d'objets complets pour tous les objets affichant des informations. Tu en affiches un, au début. Les objets du second jeu sont cachée par HIDE. Puis, pour l'affichage suivant, tu places toutes les valeurs dans les objets du deuxième jeu d'objets, tu le montres par une commande SHOW sur tous ces objets, et tu caches le premier jeu par un HIDE sur tous ses objets. Pour l'affichage suivant, tu fais l'inverse, et ainsi de suite. Prends bien soin de toujours faire la série des SHOW avant la série des HIDE. Tu n'auras plus de scintillement.

EDIT

La fonction GetTickCount est ce que tu peux avoir de plus précis dans un système Windows standard, à moins d'avoir une carte horloge dite "temps réel" avec une résolution plus fine, basée sur un quartz indépendant. Il faut se rappeler que Windows est un système "temps partagé" etnon un système "temps réel". Dans un système temps partagé, le temps d'unité centrale est attribué par le noyau du système, aux différentes tâches (processus, voire streams sous Windows), selon un système de priorités complexe. Et le fait qu'un timer termine son intervalle et déclenche son évènement ne signifie pas que la routine évènement soit exécutée immédiatement, bien au contraire. Cela signifie simplement que la demande d'exécution de la routine évènement est placée dans une file d'attente via le mécanisme des messages système, lui-même soumis aux règles de gestion par priorité. Et lorsque le noyau détermine que c'est au tour de cette demande particulière d'être exécutée, alors il va déclencher la routine, pas avant. Et ceci explique qu'une horloge gérée par un timer prend systématiquement du retard, jamais de l'avance. Par contre, si tu utilises le timer pour interroger la fonction GetTickCount, tu mets peut-être l'affichage de l'horloge à jour à des intervalles légèrement irréguliers, mais toujours avec la bonne valeur de l'horloge interne de Windows. Mais rappelons que cette horloge dépend de la qualité et de la fréquence du quartz de l'unité centrale et n'a pas non plus la précision d'une horloge atomique.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Chronomètre   Mar 13 Oct 2015 - 11:07

Il y a plus simple. Créer un picture sur le masque affiché.
Créer un picture masqué sur lequel on pose l'alpha et faire le système de double tampon entre les images en affichant les valeurs sur l'image masqué puis en copiant cette image sur l'image affichée. Je pense que ça devrait le faire. (Ce sera plus discret, je pense que de "swapper" toute la fenêtre)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Marc37



Nombre de messages : 457
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Chronomètre   Mar 13 Oct 2015 - 13:54

Bonjour à tous,

Quelques précisions :
Je n'ai pas de problème de scintillement.  Very Happy
Je n'ai plus de problème de précision.  bounce
Je voulais juste améliorer le défilement des dixièmes qui parfois, visuellement, traîne un peu ou accélère.  Rolling Eyes

Encore merci à tous pour vos remarques et conseils.

@Klaus: Merci pour l'info d'une boucle WHILE !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Marc37



Nombre de messages : 457
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Chronomètre   Mer 14 Oct 2015 - 1:34

Bonjour à tous !

Voici la version  (peut-être définitive ?) de mon chronomètre.

Code:
DIM Compteur%, Heures, Minutes, Secondes, Millisecondes, Still%, Couleur%, a, b%, Compteur_reference%
DIM HH$, MM$, SS$, MS$
DIM Affichage$

LABEL Bouton_Start, Bouton_Pause, Bouton_Stop, Bouton_Raz, Changement_Couleur, Comptage

Affichage_Mask()

TIMER 6
   TIMER_INTERVAL 6, 33
   TIMER_OFF 6
   ON_TIMER 6, Comptage

Couleur% = 1

dll_on "kernel32"

ON_CLICK 1, Bouton_Start
ON_CLICK 2, Bouton_Pause
ON_CLICK 3, Bouton_Stop
ON_CLICK 4, Bouton_Raz
ON_CLICK 5, Changement_Couleur

END
' ------------------------------------------------------------------------------
Bouton_Start:
   TIMER_ON 6
   Compteur_Reference% = dll_call0("GetTickCount")
   b% = Compteur_Reference% - compteur%
   STILL%=0
RETURN
' ------------------------------------------------------------------------------
Bouton_Pause:
   IF STILL%=1 THEN STILL%=0 : ELSE : STILL%=1
RETURN
' ------------------------------------------------------------------------------
Bouton_Stop:
   TIMER_OFF 6
RETURN
' ------------------------------------------------------------------------------
Bouton_Raz:
   TIMER_OFF 6
   Compteur% = 0
   CAPTION 5, "00:00:00,0"
RETURN
' ------------------------------------------------------------------------------
Changement_Couleur:
   Couleur% = Couleur% + 1
   IF Couleur% = 7 THEN Couleur% = 1
   SELECT Couleur%
      Case 1 : FONT_COLOR 5, 255,0,0
      Case 2 : FONT_COLOR 5, 0,255,0
      Case 3 : FONT_COLOR 5, 0,0,255
      Case 4 : FONT_COLOR 5, 0,255,255
      Case 5 : FONT_COLOR 5, 255,0,255
      Case 6 : FONT_COLOR 5, 255,255,0
   END_SELECT
RETURN
' ------------------------------------------------------------------------------
Comptage:
   Compteur_Reference% = dll_call0("GetTickCount")
   Compteur% = (Compteur_reference% - b%)
   IF Compteur% = 8619999 THEN Timer_OFF 6
   IF Still%=0
   Heures = (Compteur% / (24*60*60*1000))*24
   Minutes = frac(Heures)*60
   Secondes = frac(Minutes)*60
   Millisecondes = frac(Secondes)*1000
   HH$ = str$(int(Heures)) : while len(HH$) < 2 : HH$ = "0" + HH$ : end_while
   MM$ = str$(int(Minutes)) : while len(MM$) < 2 : MM$ = "0" + MM$ : end_while
   SS$ = str$(int(Secondes)) : while len(SS$) < 2 : SS$ = "0" + SS$ : end_while
   MS$ = str$(int(Millisecondes)): while len(MS$) < 3 : MS$ = "0" + MS$ : end_while
   Affichage$ = HH$ + ":"  + MM$ + ":" + SS$ + "," + left$(MS$,1)
   CAPTION 5, Affichage$
   END_IF
RETURN
'-------------------------------------------------------------------------------
SUB Affichage_Mask()

WIDTH 0, 420
   HEIGHT 0, 191
   COLOR 0, 0,0,0
   FONT_NAME 0, "arial"
   FONT_SIZE 0, 14

BUTTON 1
   TOP 1, 100
   LEFT 1, 2
   WIDTH 1, 100
   HEIGHT 1, 50
   CAPTION 1, START

BUTTON 2
   TOP 2, 100
   LEFT 2, 102
   WIDTH 2, 100
   HEIGHT 2, 50
   CAPTION 2, PAUSE

BUTTON 3
   TOP 3, 100
   LEFT 3, 202
   WIDTH 3, 100
   HEIGHT 3, 50
   CAPTION 3, STOP

BUTTON 4
   TOP 4, 100
   LEFT 4, 302
   WIDTH 4, 100
   HEIGHT 4, 50
   CAPTION 4, R.A.Z

ALPHA 5
   TOP 5, 14
   LEFT 5, 48
   WIDTH 5, 380
   HEIGHT 5, 80
   FONT_SIZE 5, 48
   FONT_COLOR 5, 255,0,0
   CAPTION 5, "00:00:00,0"

END_SUB

Améliorations depuis la première version :
- La précision de comptage devenue très bonne ;
- Le défilement des dixièmes de secondes est devenu régulier ;
- Rectification de la logique des boutons START et PAUSE.

Merci à tous de votre aide.
N’hésitez pas à me dire ce qu’il faudrait améliorer, que ce soit dans le fonctionnement ou dans l’écriture du programme.

Je vais remplacer le titre du sujet "Chronomètre ..... imprécis" par "Chronomètre"


Dernière édition par Marc37 le Mer 14 Oct 2015 - 9:05, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5551
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Chronomètre   Mer 14 Oct 2015 - 3:05

Salut Marc37.
C’est presque parfait !
Pourquoi « presque » ?
Change le s/p
Code:

Bouton_Pause:
   IF STILL%=1 THEN STILL%=0 : ELSE : STILL%=1  
RETURN

Comme ceci


Code:

Bouton_Pause:
   IF STILL%=1 THEN STILL%=0 : ELSE : STILL%=1
   if caption$(2) = "PAUSE" then caption 2,"CONTINUE" : else : caption 2,"PAUSE"
RETURN
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
pascal10000

avatar

Nombre de messages : 536
Localisation : Troyes
Date d'inscription : 05/02/2011

MessageSujet: Re: Chronomètre   Mer 14 Oct 2015 - 7:50

bonjour

marc voila ce que je proposais
et si ça peut t’amusé dans mon web j'ais une
font lcdd.ttf
ID: panoramic@pascal10000 MP:panoramic123



Code:
DIM Compteur%, Heures%, Minutes%, Secondes%, dixiemes%, Still%, Couleur%, a
DIM HH$, MM$, SS$, CC$
DIM Affichage$

LABEL Bouton_Start, Bouton_Pause, Bouton_Stop, Bouton_Raz, Changement_Couleur, Comptage

WIDTH 0, 420
  HEIGHT 0, 191
  COLOR 0, 0,0,0
  FONT_NAME 0, "arial"
  FONT_SIZE 0, 14

BUTTON 1
  TOP 1, 100
  LEFT 1, 2
  WIDTH 1, 100
  HEIGHT 1, 50
  CAPTION 1, START

BUTTON 2
  TOP 2, 100
  LEFT 2, 102
  WIDTH 2, 100
  HEIGHT 2, 50
  CAPTION 2, PAUSE

BUTTON 3
  TOP 3, 100
  LEFT 3, 202
  WIDTH 3, 100
  HEIGHT 3, 50
  CAPTION 3, STOP

BUTTON 4
  TOP 4, 100
  LEFT 4, 302
  WIDTH 4, 100
  HEIGHT 4, 50
  CAPTION 4, R.A.Z

ALPHA 5
  TOP 5, 14
  LEFT 5, 48
  WIDTH 5, 380
  HEIGHT 5, 80
  font_name 5,"LCDD"
  FONT_SIZE 5, 48
  FONT_COLOR 5, 255,0,0
  CAPTION 5, "00:00:00,0"

TIMER 6
  TIMER_INTERVAL 6, 89
  TIMER_OFF 6
  ON_TIMER 6, Comptage

Couleur% = 1

ON_CLICK 1, Bouton_Start
ON_CLICK 2, Bouton_Pause
ON_CLICK 3, Bouton_Stop
ON_CLICK 4, Bouton_Raz
ON_CLICK 5, Changement_Couleur

END
' ------------------------------------------------------------------------------
Bouton_Start:
  TIMER_ON 6
  STILL%=0
RETURN
' ------------------------------------------------------------------------------
Bouton_Pause:
  STILL%=1
RETURN
' ------------------------------------------------------------------------------
Bouton_Stop:
  TIMER_OFF 6
RETURN
' ------------------------------------------------------------------------------
Bouton_Raz:
  TIMER_OFF 6
  Compteur% = 0
  CAPTION 5, "00:00:00,0"
RETURN
' ------------------------------------------------------------------------------
Changement_Couleur:
  Couleur% = Couleur% + 1
  IF Couleur% = 7 THEN Couleur% = 1
  If couleur% = 1 THEN FONT_COLOR 5, 255,0,0
  If couleur% = 2 THEN FONT_COLOR 5, 0,255,0
  If couleur% = 3 THEN FONT_COLOR 5, 0,0,255
  If couleur% = 4 THEN FONT_COLOR 5, 0,255,255
  If couleur% = 5 THEN FONT_COLOR 5, 255,0,255
  If couleur% = 6 THEN FONT_COLOR 5, 255,255,0
RETURN
' ------------------------------------------------------------------------------
Comptage:
  Compteur%=Compteur%+1
  IF Compteur% = 8619999 THEN Timer_OFF 6
  IF Still%=0
      dixiemes% =dixiemes% +1
      if dixiemes%=10 then dixiemes%=0
      CC$=STR$(dixiemes%)
      a=(compteur%-dixiemes%)/10
      Heures%=INT(a/3600)
      IF Heures% < 10 THEN HH$="0"+STR$(Heures%): ELSE : HH$=STR$(Heures%)
      a=a-(heures%*3600)
      Minutes%=INT(a/60)
      IF Minutes% < 10 THEN MM$="0"+STR$(Minutes%): ELSE : MM$=STR$(Minutes%)
      a=a-(Minutes%*60)
      Secondes%=a
      IF Secondes% < 10 THEN SS$="0"+STR$(Secondes%): ELSE : SS$=STR$(Secondes%)
      CAPTION 5, HH$ + ":"  + MM$ + ":" + SS$ + "," + CC$
  END_IF
RETURN
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 466
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: Chronomètre   Mer 14 Oct 2015 - 11:10

Klaus a écrit:
La fonction GetTickCount est ce que tu peux avoir de plus précis dans un système Windows standard, à moins d'avoir une carte horloge dite "temps réel" avec une résolution plus fine, basée sur un quartz indépendant.

Si,si, il y a encore plus précis. Fait une recherche sur 'high-resolution performance timer'; En panoramic pur c'est moins évident à coder car il ne connait que les entiers à 32bits et que dans le cas du 'high-resolution performance timer',faut manipuler des entiers 64bits.

@Marc37
Il y a un pb dans chronomètre, si tu le démarre puis qu'au bout de qq secondes tu appuies sur pause, ça c'est ok. Maintenant, si tu appuies à nouveau sur pause, le chrono ne redémarre pas de la valeur sur laquelle il était arreté, mais de la valeur sur laquelle il était arrêté + le temps écoulé depuis l'appui sur pause. Du coup, le bouton pause n'en n'est plus vaiment un.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10075
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Chronomètre   Mer 14 Oct 2015 - 14:38

Citation :
Si,si, il y a encore plus précis. Fait une recherche sur 'high-resolution performance timer
J'ai rendu ce timer accessible via KGF.dll. Ceci dit, il y a des contraintes dues aux limitations à 32 bits, et d'autres liées à la fiabilité de ce timer qui dépend largement du hardware et est soumis aux bugs à la fois du hardware et de Windows lui-même. Toutes ces contraintes le limitent à un usage de mesure d'intevalles inférieurs à 20 minutes, grosso modo. Avec la nouvelle version de KGF.dll, j'ai fait ceci, pour mesurer la durée de la commande "pause 2000":
Code:



dim res%, ticks%, tim1%, tim2%

dll_on "KGF.dll"

ticks% = dll_call1("GetHighPerformanceTimer",0)
res% = dll_call1("GetHighPerformanceTimer",1)
tim1% = dll_call1("GetHighPerformanceTimer",2)
pause 200
tim2% = dll_call1("GetHighPerformanceTimer",2)
message str$((tim2%-tim1%)*1000/ticks%)
end
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Marc37



Nombre de messages : 457
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Chronomètre   Mer 14 Oct 2015 - 18:53

@Pascal1000 :
Merci pour la police LCDD.TTF. Ne sois pas vexé, mais je vais garder la police ARIAL qui est déjà installée avec toutes les version de Windows.

@Papydall :
Merciiii !

@Silverman :
La touche PAUSE ne sert pas à interrompre le comptage, mais à figer l’affichage.
Si tu veux interrompre le comptage, prends la touche STOP, puis START pour reprendre.

@Klaus :
Merciiii !

@ tous :
Merci à tous d’avoir participé et testé ce chronomètre.
La précision au delà du dixième n’est pas nécessaire pour ce chronomètre. Rien que le temps de réaction de l’être humain pour appuyer sur le bouton de la souris, ajouter au temps de réaction de la machine, plusieurs dixièmes de secondes ont eu le temps de s’échapper !
Voilà pourquoi, lors de l’étude préliminaire, je n’avais prévu d’afficher qu’un seul chiffre après les secondes, c’est à dire les dixièmes.

En informatique, ce n’est jamais fini… On peut toujours en ajouter !
Entre autres, ajouter la commande START/STOP à partir du clavier (touche ESPACE), mémoriser sur le disque dur la position de la fenêtre et la couleur de l’afficheur…
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jack
Admin
avatar

Nombre de messages : 1764
Date d'inscription : 28/05/2007

MessageSujet: Re: Chronomètre   Dim 18 Oct 2015 - 13:45

La prochaine version aura la variable NUMBER_TICKS qui donnera le nombre de millisecondes écoulées depuis l'allumage du PC.

_________________
username : panoramic@jack-panoramic password : panoramic123
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://panoramic.free-boards.net
Contenu sponsorisé




MessageSujet: Re: Chronomètre   

Revenir en haut Aller en bas
 
Chronomètre
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Un arbuste en 30 secondes chrono
» ETREX 20 : Chronomètre

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: