Temps

Signaler
Messages postés
173
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
13 octobre 2007
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
hhhp2004

salut,

mettez le code suivant dans un form et dites moi svp pourquoi time1 negale pas time2 (time1 est en millisecondes, time2 est en secondes ... donc quand time1=1000 time2=1) ... si vous mettez sleep(1) les 2 time ne nauront pas la meme valeur ex. time1=800 ms, time2 = 1 s .... si vous mettez sleep(1000) les 2 time seront egaux ...

mettez sur le form 2 timers, 1 commandbutton et 2 label

Option Explicit


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Dim time As Long 'time in miliseconds


Dim time2 As Long




Private Sub timeLoop()


 Do
 
  DoEvents
 
  Call Sleep(1)
 
  time = time + 1
 
 Loop


End Sub


Private Sub Command1_Click()
 
 Timer1.Interval = 1
 Timer2.Interval = 1000
 Call timeLoop


End Sub


Private Sub Timer1_Timer()


 Label1.Caption = time


End Sub


Private Sub Timer2_Timer()


 time2 = time2 + 1
 
 Label2.Caption = time2


End Sub

merci beaucoup

5 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
C'est dû tout simplement à la longueur d'éxécution des instructions : un Sleep(1) est censé duré 1 ms, mais en réalité, il dure : le temps de l'appel de la fonction (environ 16 ms il me semble), puis le temps d'éxécution de la fonction, et enfin, la ms de pause !
Idem pour les timers : même si on peut mettre un interval de 1 ms, ils ne sont pas aussi précis et neu peuvent pas se déclancher toutes les millisecondes !

Il s'agit d'une question récurrente qui revient de temps en temps sur le forum, tu aurais cherché un peu avant de demander, tu aurais trouver ta réponse plus rapidement.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
salut
pour sleep je ne sais pas le temps réel (calculable sur demande, mais forcément un peu variable selon les PC)
pour timer c'est 18ms min

ce test serait plus juste comme suit MAIS il sera forcément de plus en plus faussé dans la durée
(le doevents prend un temps variable sur chaque PC, etc....)

Option Explicit 

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
Dim lTime1 As Long  'time in miliseconds
Dim lTime2 As Long 

Private Sub Command1_Click() 
    Timer1.Interval =  10 
    Timer2.Interval = 100 
    Call timeLoop 
End Sub 
Private Sub timeLoop() 
    Do 
        DoEvents 
        Call Sleep(100) 
        lTime1 = lTime1 + 1 
    Loop 
End Sub 

Private Sub Timer1_Timer() 
    Label1.Caption = lTime1 
End Sub 

Private Sub Timer2_Timer() 
    lTime2 = lTime2 + 1 
    Label2.Caption = lTime2 
End Sub

<small> Coloration
syntaxique automatique [AFCK] </small>
       

++
PCPT  [AFCK]
<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
173
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
13 octobre 2007

hhhp2004

salut et merci davoir repondu...

Dapres vous, est quil y aurait moyen de dexecuter quelque chose toutes les 1 milisecondes (precis)

Tout ca cest parce que je veux faire un moteur de jeu ... et dans ce moteur il faut le temps ... non?

merci encore
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
toutes les millisecondes ? Tu n'as pas l'impression que ca fait très très court comme intervale et que ca risque bouffer toutes les ressources du proc ?

Pour obtenir un temps, le mieux c'est de travailler non pas sur un intervale de 1 ms et de compter le nombre de millisecondes comme cà (car cà bouffe tout les cycles de processeur !), mais de calculer l'intervale de temps (avec la fonction de l'API GetTickCount par exemple) entre deux temps régulier : par exemple, pour chaque frame de ton jeu affichée à l'écran, tu récupère le nombre de ms écoulées depuis la dernière frame affiché, ca évite ainsi de devoir calculer le nombre de ms entre chaque image affichée ! Il serait même bien plus efficace de le faire toutes les 10 ou 15 frames affichées si tu veux optimiser le traitement !
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
salut,
moteur de jeu... tout dépend. je rejoins DarkSidious sur le principe mais tout dépend ta demande.

timer à 1ms c'est possible avec les API MIDI.
regarde dans mes sources (TIMER OCX) et lit les commentaires, tu y trouveras peut-être des pistes intéressantes.

NB : un intervalle ci court, réfléchi bien aux besoins réels. çà consomme vraiment énormément de ressources (100%?!!!)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp