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
» Le Forum est en vacances.
par JL35 Aujourd'hui à 21:20

» Une autre façon de terminer une application.
par JL35 Hier à 14:27

» Compilateur FBPano
par Mike Lun 21 Aoû 2017 - 23:17

» Pb 20 (en analyse): plantage à l'appel d'un SUB
par Jack Lun 21 Aoû 2017 - 21:58

» Pb 19 (en analyse): libellé d'erreur dans des IF imbriqués
par Jack Lun 21 Aoû 2017 - 21:55

» Copier / coller du texte à partir de la fenêtre de commandes
par jean_debord Lun 21 Aoû 2017 - 9:46

» COMPILATEUR V 0.9 beta 8 du 18 aout 2017
par papydall Lun 21 Aoû 2017 - 5:01

» Mettre en windows en veille
par papydall Lun 21 Aoû 2017 - 4:15

» Stretch_on ne stretch plus...
par papydall Dim 20 Aoû 2017 - 15:22

» Pb 18 (en analyse): RESTORE_LABEL avec DATA à la fin
par Jack Dim 20 Aoû 2017 - 13:21

» Problème de traitement des opérateurs avec le compilateur.
par Pedro Alvarez Sam 19 Aoû 2017 - 20:01

» Pb 17 (résolu): ITEM_SELECT ne fonctionne pas
par Jack Jeu 17 Aoû 2017 - 19:26

» un nouveau editeur panobasic
par Jean Claude Jeu 17 Aoû 2017 - 10:18

» Le compilateur.
par Pedro Alvarez Jeu 17 Aoû 2017 - 8:36

» Pb 16 (résolu): ON_CLOSE plante à l'exécution
par Jack Mer 16 Aoû 2017 - 20:00

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Août 2017
LunMarMerJeuVenSamDim
 123456
78910111213
14151617181920
21222324252627
28293031   
CalendrierCalendrier

Partagez | 
 

 Chronomètre

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



Nombre de messages : 443
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 : 4989
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 : 519
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 : 464
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 : 519
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 : 4989
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 : 443
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 : 464
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 : 5522
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 : 443
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 : 10062
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 : 5849
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 : 443
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 : 443
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 : 5522
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 : 519
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 : 464
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 : 10062
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 : 443
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 : 1746
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
» Compte à rebours multiple
» Code java pour un chronometre.
» affichage d'un 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 32 bits :: Vos sources, vos utilitaires à partager-
Sauter vers: