Page 1 sur 1

Chrono

Publié : sam. 22/mai/2004 17:07
par bugrane
Bonjour,

Je voudrais utiliser la librairie pureBasic Tools pour faire un chronomètre précis au centième de seconde. Quelqu'un pourrais-t'il me dire si réellement je pourrais obtenir un chrono fiable.

Merci

Henri :?:

Publié : sam. 22/mai/2004 17:10
par Le Soldat Inconnu
oui

tu peux utiliser la fonction GetTickCount_() qui donne le temps en 1000ième de seconde ;)

exemple :

Code : Tout sélectionner

temps = GetTickCount_()
; tu fais ton action

temps = GetTickCount_() - temps
debug "Le temps mis est de " + str(temps) + "ms"

Publié : sam. 22/mai/2004 17:26
par bugrane
Merci Regis, je ne trouve aucune trace de Gettickcount dans l'aide de purebasic ou de purebasic tools.
Faut t'il initialiser le timer puis-je par exemple utiliser le code ci-dessous
(Il est encore très incomplet)

Declare MonChrono()
Global temp$
Global DixiemeSecondes
Global Secondes

DixiemeSecondes=0
Secondes=0


OpenWindow(1, 100, 100, 500, 200, #PB_Window_SystemMenu, "Chrono")
CreateGadgetList(WindowID())
StringGadget(2,200, 10, 200, 20, "")
StartTimer( 0, 100, @MonChrono() )
SetGadgetText(2, Temp$)

Repeat
Delay(10)


Until WaitWindowEvent() = #PB_Event_CloseWindow

temps = GetTickCount_()
; tu fais ton action

temps = GetTickCount_() - temps
Debug "Le temps mis est de " + Str(temps) + "ms"
Procedure MonChrono()
Temp$=FormatDate("%hh:%ii:%ss", Date())
DixiemeSecondes=DixiemeSecondes+1
If DixiemeSecondes>9
DixiemeSecondes=0
Secondes=Secondes+1
EndIf
DixiemeSeconde$=Str(DixiemeSecondes)
Seconde$=Str(Secondes)
SetGadgetText(2, Seconde$+":"+DixiemeSeconde$)

EndProcedure

Publié : sam. 22/mai/2004 17:32
par bugrane
Désolé pour l'envoi précédant, j'ai mélangé eux morceaux de code


Code : Tout sélectionner

Declare MonChrono()
Global temp$
Global DixiemeSecondes
Global Secondes

DixiemeSecondes=0
Secondes=0


OpenWindow(1, 100, 100, 500, 200, #PB_Window_SystemMenu, "Chrono")  
CreateGadgetList(WindowID())
StringGadget(2,200, 10, 200, 20, "") 
StartTimer( 0, 100, @MonChrono() ) 
SetGadgetText(2, Temp$) 
  
    Repeat 
       Delay(10)
       
  
    Until WaitWindowEvent() = #PB_Event_CloseWindow 
    

Procedure MonChrono()
  Temp$=FormatDate("%hh:%ii:%ss", Date())
  DixiemeSecondes=DixiemeSecondes+1
  If DixiemeSecondes>9 
     DixiemeSecondes=0
     Secondes=Secondes+1
  EndIf
  DixiemeSeconde$=Str(DixiemeSecondes)
  Seconde$=Str(Secondes)
  SetGadgetText(2, Seconde$+":"+DixiemeSeconde$)
   
EndProcedure

Publié : sam. 22/mai/2004 17:34
par julien
bugrane a écrit :je ne trouve aucune trace de Gettickcount dans l'aide de purebasic ou de purebasic tools.
Normal c'est pas dans l'aide puisque c une Librairie de l'OS

Publié : sam. 22/mai/2004 17:50
par Dr. Dri
cherche ElapsedMilliseconds() dans l'aide, par contre je ne suis pas sûr de l'orthographe...

Dri

Publié : sam. 22/mai/2004 20:32
par LavaLava
ElapsedMilliseconds() est une nouvelle instruction de PB 3.90 et elle à l'air de bien tourner...

Publié : sam. 22/mai/2004 21:28
par bugrane
Merci à tous

Mon chrono fonctionne à merveille.

Publié : mer. 09/juin/2004 17:07
par hardy
Très utile aussi: timerid=SetTimer(0,0,t,@proc())
lance la procédure proc() toute les t millisecondes.
Pratique pour les animations de fond.

Il y a évidemment KillTimer_(hwnd,timerid) pour le stopper (hwnd=handle de la fenêtre qui a lancé le timer)

Publié : jeu. 10/juin/2004 9:49
par fweil
Avec tous ces conseils :

Code : Tout sélectionner

Enumeration
  #Fenetre_principale
  #Image
  #Gadget_Image
EndEnumeration

Global Largeur_fenetre.l, Hauteur_fenetre.l, IDImage.l, Pi.f, Depart.l

Procedure Dessine_Aiguille(Longueur.l, Angle.f, CX.l, CY.l, Couleur.l)
  LineXY(CX, CY, CX + Longueur * Cos(Angle), CX + Longueur * Sin(Angle), Couleur)
EndProcedure

Procedure Dessine_Pendule()
  IDImage = CreateImage(#Image, Largeur_fenetre, Hauteur_fenetre)
  StartDrawing(ImageOutput())
    CX.l = Largeur_fenetre / 2
    CY.l = Hauteur_fenetre / 2
    Box(0, 0, Largeur_fenetre, Hauteur_fenetre, #White)
    Box(1, 1, Largeur_fenetre - 2, Hauteur_fenetre - 2, $400000)
    Dessine_Aiguille(CX * 0.6, Pi * (2 * Hour(Date()) / 12 - 1 / 2), CX, CY, #Yellow)
    Dessine_Aiguille(CX * 0.8, Pi * (2 * Minute(Date()) / 60 - 1 / 2), CX, CY, #Green)
    Dessine_Aiguille(CX * 0.75, Pi * (2 * Second(Date()) / 60 - 1 / 2), CX, CY, #Red)
    Milliseconde = (ElapsedMilliseconds() - Depart) % 1000
    Dessine_Aiguille(CX * 0.75, Pi * (2 * Milliseconde / 1000 - 1 / 2), CX, CY, #Blue)
  StopDrawing()
  SetGadgetState(#Gadget_Image, IDImage)
EndProcedure

;
;
;
  Sortie = #FALSE
  Largeur_fenetre = 240
  Hauteur_fenetre = 240
  Pi = 3.14159265
  Depart = ElapsedMilliseconds()
  If OpenWindow(#Fenetre_principale, 0, 0, Largeur_fenetre, Hauteur_fenetre, #PB_Window_BorderLess | #PB_Window_ScreenCentered, "PureBasic Chrono")
      AddKeyboardShortcut(#Fenetre_principale, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
      If CreateGadgetList(WindowID(#Fenetre_principale))
          ImageGadget(#Gadget_Image, 0, 0, Largeur_fenetre, Hauteur_fenetre, IDImage)
      EndIf
      Milli = SetTimer_(0, 0, 1, @Dessine_Pendule())
      Repeat
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
            Sortie = #TRUE
          Case #PB_Event_Menu
            Select EventMenuID()
              Case #PB_Shortcut_Escape
                Sortie = #TRUE
            EndSelect
        EndSelect
      Until Sortie
  EndIf
End

Publié : dim. 17/oct./2004 22:17
par jnspunk
Très utile aussi: timerid=SetTimer(0,0,t,@proc())
lance la procédure proc() toute les t millisecondes.
Pratique pour les animations de fond.

Il y a évidemment KillTimer_(hwnd,timerid) pour le stopper (hwnd=handle de la fenêtre qui a lancé le timer)
Merci! c' est exactement ce que je cherchais!!!
pas de gestion des timers dans purebasic, mais j' espere pour bientot ^^

a noter dans une faq si il y en a une :D

un petite précision cependant, le GetTickCount_() n' est pas au 1000eme de seconde, mais ce déclenche que toute les 16ms a peu prés. impossible de fabriquer un timer à partir de celui ci!

Publié : dim. 17/oct./2004 22:29
par jnspunk
a ben non c pareil, ca me fait ramé le jeu ^^
ca se déclenche que toute les 16ms a peu prés...