Timer précis

calimero63110 Messages postés 33 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 14 décembre 2008 - 7 sept. 2008 à 09:26
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009 - 8 sept. 2008 à 13:49
Bonjour,

Je cherche a realiser un timer précis, ( maximum 5ms d'erreur ), il est réglé sur 30-40 ms, or il tick toutes les 70ms ! ( le code présent a l'interieur n'est pas tres volumineux ni long a executer.

Je cherche donc par nimporte quel moyen a rendre ce timer précis.

J'ai essayé via un timer avec l'api windows :

SetTimer Me.hwnd, 0, 40, AddressOf TimerProc
On obtiens EXACTEMENT le même resultat qu'avec le timer windows. Comment faire ?

12 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 sept. 2008 à 09:37
Bonjour,

essaye alors de le faire "ticker" toutes les millisecondes (intervalle de 1 ms) et utilise, dans ses unstrructions, une variable static utilisant la fonction Timer, de sorte à ne lancer une exécution que si la nouvelle valeur de la fonction timer est >= 5 par rapport à ta variable static.
0
calimero63110 Messages postés 33 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 14 décembre 2008
7 sept. 2008 à 09:49
C'est a dire :

A la fin du timer :
tick = gettickcount

au début

Do While gettickcount < tick + 40
DoEvents
Loop

c'est bien ça ?

Or je suppose qu'avec une machine peu puissante, l'équart va être encore plus important, voir ne pourra même pas ticker toutes les 40ms, non ?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 sept. 2008 à 11:22
Re,

Non ...

Le principe est le suivant (ici avec un contrôle timer ... que tu peix remplacer par ton Timer/api et la fonction Timer (que tu peux remplacer par ton GetTickCount, si tu veux).

Une Form, un timer, un bouton Lancer et un bouton Stopper

Essaye :

Private debut As Double, fois As Double



Private Sub lancer_Click()
 debut = Timer
 Timer1.Interval = 1
 Timer1.Enabled = True
End Sub



Private Sub stopper_Click()
  Dim duree As Double, frequence As Double
  duree = Timer - debut
  frequence = duree / fois
  MsgBox "j'ai battu " & fois & " fois pendant " & duree & " secondes " & _
  "soit toutes les " & Format(frequence, "#0.000") & " secondes"
  fois = 0
End Sub



Private Sub Timer1_Timer()
  Static toto As Double  If toto 0 Then toto Timer
  If Timer >= toto + 0.005 Then
   fois = fois + 1
  End If
End Sub


Tu n'arriveras jamais à ta fréquence de 0.005 secondes, toutefois, quel que soit le procédé ... sauf si ton matériel est super exceptionnel.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 sept. 2008 à 11:35
Euh... un oubli de réiunitialisation de toto ...
corrige :

Private Sub Timer1_Timer()
  Static toto As Double  If toto 0 Then toto Timer
  If Timer >= toto + 0.5 Then
   fois = fois + 0.005
   toto = Timer
  End If
End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
calimero63110 Messages postés 33 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 14 décembre 2008
7 sept. 2008 à 12:19
Euh la sa tick toutes les 30ms ?

C'est precis ? a 5ms pret c'est toutes les 30ms ?
0
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
7 sept. 2008 à 13:30
Bonjour,

"Or je suppose qu'avec une machine peu puissante, l'équart va être
encore plus important, voir ne pourra même pas ticker toutes les 40ms,
non ?"

Oui, Windows n'est pas un système temps réel donc aucune garantie sur le temps d'éxécution.

As-tu tenté de changer la priorité de ton processus ?
Dans le gestionnaire des tâches, dans l'onglet Processus, clic droit sur ton processus, définit la priorité "Haute" ou "Temps réel" (Temps réel peut rendre Windows instable)
Infos ici : http://sravier.free.fr/info/w2k_priorites.html
et ici http://www.vbfrance.com/codes/PROCESSPRIORITY_40455.aspx

Akim
0
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
7 sept. 2008 à 13:36
Hello,

Pour des timer précis et tout ce qui concerne la gestion du temps, on pourra se référer au site de la FAQ Visual Basic et notamment à l'article :

"Comment chronométrer mon programme ? Comment mesurer précisément le temps ?" :

http://faq.vb.free.fr/index.php?question=176

L'article présente plusieurs méthodes, en fonction de la précision souhaitée.

Cordialement

Jean-Marc
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 sept. 2008 à 15:22
salut,

précision (intervalle mini) du contrôle timer : 18ms.
précision par API : 10ms

possible de passer en dessous avec les api MIDI mais c'est un gouffre de ressources et le succès dépend du processeur.

bref il doit y avoir quelque chose que tu ne nous dis pas, un contrôle timer réglé à 40ms sera fonctionnel
le code dans l'évènement est peut être un peu plus long que "

pas tres volumineux ni long a executer

"

++


<hr size="2" width="100%" />
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp

 
0
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
7 sept. 2008 à 16:42
On atteint quand même sans soucis une résolution fiable d'une dizaine de microsecondes avec QueryPerformanceCounter, qui n'est pas un "gouffre de ressources" :-) (avec une machine à au moins 1 Ghz).

Cf. : http://faq.vb.free.fr/index.php?question=176#p5

La doc (MSDN) est indiquée en fin d'article.

(jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 sept. 2008 à 16:58
oui pour comparer 2 valeurs (chrono), mais pas pour faire un timer

si c'est pour faire

tant que différence <= X
doevents

le temps sera plus que variable, selon la machine elle-même mais également l'activité au moment T.
et de toute manière le proc (principal) poussera à 100%
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
calimero63110 Messages postés 33 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 14 décembre 2008
7 sept. 2008 à 18:21
.:.Hello, Pour des timer précis et tout ce qui concerne la gestion du
temps, on .:.pourra se référer au site de la FAQ Visual Basic et notamment
à l'article : .:."Comment chronométrer mon programme ? Comment mesurer
précisément le .:.temps ?" : http://faq.vb.free.fr/index.php?question=176
L'article présente .:.plusieurs méthodes, en fonction de la précision
souhaitée. Cordialement :.:Jean-Marc

Comment faire pour executer un code a intervale réguliere, comme avec les timers windows ^^ parceque là, c'est des codes pour calculer le temps entre deux intervales.

J'avais avant :

Do while true
tick = gettickcount
do while gettickcount < tick + 30
doevents
loop
Loop

J'ai mis un timer pour alleger le cpu, je ne souhaite en aucun cas remettre une boucle !
0
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
8 sept. 2008 à 13:49
PCPT: tu as raison bien sur. Les méthodes données permettent de mesure le temps, pas de déclencher des évènements, du moins pas avec cette précision. Si on descend en dessous de la milliseconde, la charge de la machine influera sur la précision bien au dela de l'ordre de grandeur de la résolution du timer. A moins d'utiliser d'autres techniques telles que celles que tu évoquais dans un post précédent. Et dans tous les cas, le CPU ne va pas chômer...
0
Rejoignez-nous