Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Mesure d'une durée | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Mesure d'une durée Dim 4 Déc 2011 - 14:21 | |
| Avec Panoramic, on n'a pas la possibilité de mesurer des durée avec une précision inférieure à la seconde (instruction TIME). Nardo a fait une DLL qui permet une précision meilleure, mais il faut la dll... Il me revient une possibilité avec ms-dos (eh oui, je suis un nostalgique du vieux temps). En effet, la commande TIME en ligne de commande donne l'heure avec une précision du centième de seconde. L'inconvénient c'est qu'elle attend une réponse (soit la touche Enter, soit la nouvelle heure qu'on veut modifier), mais avec un peu d'astuce on peut y remédier: - Code:
-
DIM fm$, i: fm$ = "c:\temp\heure.txt" EXECUTE "Cmd.exe /C ECHO.| TIME >"+fm$ FOR i = 1 TO 500000: NEXT i EXECUTE_WAIT "Cmd.exe /C ECHO.| TIME >>"+fm$ LIST 1000: HIDE 1000 FILE_LOAD 1000, fm$: FILE_DELETE fm$ PRINT MID$(ITEM_READ$(1000, 1), 24, 11): ' début PRINT MID$(ITEM_READ$(1000, 3), 24, 11): ' fin DELETE 1000 END Le "ECHO." (collés) est enchaîné (fonction 'pipe': "|")après le TIME et simule une ligne vide (ou appui sur Enter). Il suffit ensuite d'exploiter le résultat dans le fichier fm$ (ici simplement affiché). L'appel à cmd.exe prend du temps (en termes de millisecondes), mais en première approximation on peut estimer que ça prend le même temps pour les deux appels, donc que ça s'annule. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Mesure d'une durée Dim 4 Déc 2011 - 15:25 | |
| Bonjour JL35, Oui c'est une autre façon de faire... PS: Tu peux remplacer le LIST par un DLIST (ça évite le HIDE...) | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Mesure d'une durée Dim 4 Déc 2011 - 15:42 | |
| Salut Nardo. Tu as raison. Comme toujours. Ca m'énerve ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 4 Déc 2011 - 18:24 | |
| Tu pourrais essayer de jouer avec un timer pour tes millisecondes ....... ( c'est juste une idée jetée en l'air ) | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Mesure d'une durée Dim 4 Déc 2011 - 18:29 | |
| Allez ygeronimi, concrétise ton idée avant qu'elle retombe ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Re: Mesure d'une durée Lun 5 Déc 2011 - 1:21 | |
| @ jl35 : ce devrait etre une base........ - Code:
-
dim a$ , b$,i,cs,d$ label tps , affich,stop_temps ,calc
height 0,200:width 0,250 edit 1 timer 2 :timer_interval 2,10 : timer_off 2 :on_timer 2,affich button 3:top 3,20:caption 3,"Start":on_click 3,stop_temps button 5:top 5,45:caption 5,"End":inactive 5: on_click 5,stop_temps alpha 4:top 4,30:left 4,120:caption 4,"00:00:00,00" alpha 6:top 6,55:left 6,120:caption 6,"00:00:00,00" alpha 7:top 7,80:left 7,120:caption 7,"00:00:00,00" gosub tps end
tps: a$= time$ b$=",00" while a$=time$ text 1, a$+b$ end_while timer_on 2 return
affich: cs=cs+1 if cs<10 b$=",0"+str$(cs) else if cs<99 b$=","+str$(cs) else cs=0 b$=",0"+str$(cs) end_if end_if d$=time$+b$ text 1,d$ return
stop_temps: if clicked(3)=1 inactive 3 active 5 caption 4,d$ caption 6,"00:00:00,00" else inactive 5 active 3 caption 6,d$ gosub calc end_if return
calc: caption 7,"Pas eu le temps !" return ceci dit , il y a un souci avec l'affichage les secondes vont plus vite que les dixièmes y'aurait il un decalage de temps entre " Time$" et le "Timer" | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Mesure d'une durée Lun 5 Déc 2011 - 4:07 | |
| Hello Ygeronimi ! Pour rappeler le contexte regarde ceci Cependant, en chipotant un peu, tu as soulevé une chose : Je ne suis pas sûr que la base de temps des timers soit correcte, en faisant cet essai : - Code:
-
DLL_ON "bench.dll" : LABEL EndProg : ON_CLOSE 0,EndProg DIM t,Duree : LABEL cpt : t = DLL_CALL0("GetCount")+1000 timer 2:timer_interval 2,100:on_timer 2,cpt : print "Fermez la fenêtre..." END EndProg: MESSAGE STR$(Duree)+"ms": DLL_OFF TERMINATE cpt: Duree = MAX(Duree,(DLL_CALL0("GetCount")-t)) t = DLL_CALL0("GetCount") return j'obtiens pour 100 ms -> 110ms même si les appels à la dll prend du temps et provoque un décalage, 10ms (1er appel dll+MAX() ) me parait excessif... mais je chipote, je chipote... c'est peut-être du au temps d'interprétation des commandes ? Pour la plupart de nos applics ce n'est pas vraiment important... L'essentiel c'est que ce décalage soit constant. Sur mon PC, la base de temps varie entre 110 et 109ms... Panoramic n'est pas dédié à de la prog de "haute voltige", et c'est largement suffisant pour ce que nous en faisons... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Re Lun 5 Déc 2011 - 10:25 | |
| @ Nardo Comme tu dis l'essentiel est que le decalage soit constant et à ce momment là , on peut essayer dele récupérer sur le réglage de "Timer_interval". si c'est un écart de 10 ms : Timer_interval X, 9 au lieu de 10..... bonne journée ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 5 Déc 2011 - 13:22 | |
| Une petite évolution.... - Code:
-
dim a$ , b$,i,cs,d$ dim t$,t1$,t2$ dim e,f,g,h dim e1,f1,g1,h1 dim e2,f2,g2,h2 dim td,tf,diff dim e$,f$,g$,h$ label tps , affich,stop_temps ,calc
height 0,200:width 0,250 edit 1 timer 2 :timer_interval 2,9 : timer_off 2 :on_timer 2,affich button 3:top 3,20:caption 3,"Start":on_click 3,stop_temps button 5:top 5,45:caption 5,"End":inactive 5: on_click 5,stop_temps alpha 4:top 4,30:left 4,120:caption 4,"00:00:00,00" alpha 6:top 6,55:left 6,120:caption 6,"00:00:00,00" alpha 7:top 7,80:left 7,120:caption 7,"00:00:00,00" gosub tps end
tps: a$= time$ b$=",00" while a$=time$ text 1, a$+b$ end_while timer_on 2 return
affich: cs=cs+1 if cs<10 b$=",0"+str$(cs) else if cs<99 b$=","+str$(cs) else cs=0 b$=",0"+str$(cs) end_if end_if d$=time$+b$ text 1,d$ return
stop_temps: if clicked(3)=1 inactive 3 active 5 caption 4,d$ caption 6,"00:00:00,00" else inactive 5 active 3 caption 6,d$ gosub calc end_if return
calc:
t$=caption$(4) e=val(left$(t$,2)) f=val(mid$(t$,4,2)) g=val(mid$(t$,7,2)) h=val(right$(t$,2))
t1$=caption$(6) e1=val(left$(t1$,2)) f1=val(mid$(t1$,4,2)) g1=val(mid$(t1$,7,2)) h1=val(right$(t1$,2))
td=e*360000+f*6000+g*100+h tf=e1*360000+f1*6000+g1*100+h1 diff=tf-td
e2=int(diff/36000)
if e2<10 e$="0"+str$(e2) else e$=str$(e2) end_if
f2=int(diff/6000) if f2<60 if f2<10 f$="0"+str$(f2) else f$=str$(f2) end_if else f$="00" end_if
g2=int(diff/100) if g2<60 if g2<10 g$="0"+str$(g2) else g$=str$(g2) end_if else g$="00" end_if
if diff<100 h$=str$(diff) else h$="00" end_if
caption 7,e$+":"+f$+":"+g$+","+h$ return de temps en temps demeure un bug à l'affichage dont j'ai du mal à définir la source | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Mesure d'une durée Lun 5 Déc 2011 - 13:42 | |
| Il y a quand même quelque chose qui me chiffonne dans l'utilisation du timer. Je rappelle que dans mon exemple, il s'agissait de mesurer la durée d'exécution d'un morceau de programme pour optimisation éventuelle, en l'occurence la boucle: FOR i = 1 TO 500000: NEXT i Or tu lances un timer qui s'exécute et vient incrémenter un compteur tous les centièmes de seconde, et c'est ce compteur qui compte le temps. A ma connaissance, la boucle n'est pas interruptible par le timer, autrement dit le programme timer ne s'exécutera pas une seule fois pendant le déroulement de la boucle, et le compteur ne progressera pas d'un pouce. Ou quelque chose m'a échappé ?
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 5 Déc 2011 - 14:19 | |
| heuuuu........ tu peux faire un "stop_temps" au depart et à la fin de ta boucle......non? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Mesure d'une durée Lun 5 Déc 2011 - 14:57 | |
| bien sûr, mais pendant le déroulement de la boucle le timer ne passera pas, donc son compteur ne sera pas incrémenté ?
Pour ce que tu fais, c'est à dire une fonction chronomètre: mesurer le temps qui s'écoule entre deux appuis sur un bouton, ça marche, parce qu'il ne se passe rien entre ces deux appuis, le timer a tout le temps de passer et de faire son boulot.
Mais si un programme se déroule pendant le même temps, dont des parties non interruptibles comme des boucles de traitement, là le timer ne passe pas, il n'est pas déclenché ! Le timer n'est déclenché que pendant les temps d'attente du programme, quand il n'y a rien d'autre à faire et qu'il ne se passe rien d'autre.
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Mesure d'une durée Lun 5 Déc 2011 - 15:54 | |
| Tout à fait ! - Nardo26 a écrit:
- Hello Ygeronimi !
Pour rappeler le contexte regarde ceci @ygeronimi :Regarde le lien... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 5 Déc 2011 - 19:09 | |
| Mouep..... je viens de regarder le lien et là j'avoue mes limites.... | |
| | | Contenu sponsorisé
| Sujet: Re: Mesure d'une durée | |
| |
| | | | Mesure d'une durée | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |