Timer

Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
- - Dernière réponse : cs_CanisLupus
Messages postés
3758
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
- 27 oct. 2005 à 22:19
Voilà quand on met un Timer sur une Form, on à une précision quasiment au dixième. Et comme sur les jeux vidéos je vois une précision aux centième voir millième, comment fait-on pour avoir un telle précision? API?
Merçi (Désolé si j'ai été bref mais je suis un peu précé)
Afficher la suite 

18 réponses

Messages postés
221
Date d'inscription
vendredi 30 novembre 2001
Statut
Membre
Dernière intervention
13 février 2010
3
0
Merci
faut utiliser l'API "Sleep" qui permet de mettre en veille le programme un nombre donné de millisecondes
Messages postés
3758
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
6
0
Merci
Timer (contrôle ou API) a un interval en millième de seconde (interval = 1 => exécution toutes les millisecondes).

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
24
0
Merci
salut,
le timer VB est à la milliseconde, mais ne peut avoir comme valeur minimale que 18ms (1 autorisé, mais non-réel).
pour créer son timer, on peut descendre jusqu'à une précision de 10ms, grâce à différentes API
(CreateTimer, SetTimer, GetTimer, etc..)
plus précis, ce n'est pas un timer mais juste une différence entre 2 moments, API GetTickCount, GetQueryPerformance, etc...

(désolé si j'écorche, je n'ai plus l'orthographe en tête)
pour encore plus précis, jusqu'à la milliseconde, çà touche aux API en rapport au format MIDI. déjà essayé, mon PC rame trop pour pouvoir faire des tests réels...

si besoin de plus d'infos, jète un oeil à ma source Timer Interval Long ;)
++
PCPT [AFCK]
Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
0
Merci
J'ai tester déjà avec l'API Sleep :



J'ai essaye d'en faire un timer avec une précision de 10ms, mais quand
je met un timer à côté à l'interval de 1000ms, pendant que mon timer
fait 15secondes, l'API Sleep en aura fait celui lui, 10secondes. Donc
en claire l'un deux me donne une fausse information, dont je pense à
l'API Sleep.

Sinon pour ce que tu m'a dis pcpt je n'arrive pas vraiment à comprendre comment marche ces API.



Thanks
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
24
0
Merci
le plus simple est de regarder leur utilisation
http://www.vbfrance.com/code.aspx?ID=32788
PCPT [AFCK]
Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
0
Merci
Après quelques testes, l'API Sleep est effectivement pas précis, elle prend beaucoup de retard. Alors que QueryPerformance, elle, reste très précis! Merçi a toi pcpt, maintenant il faut que j'essaye d'extraire juste le chronomètre en QueryPerformance sur mon logiciel et sa sera bon (Même si je sais pas quoi prendre comme codes)
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
24
0
Merci
re,
j'insiste lourdement, désolé, mais autant QueryPerf me semble le plus précis, autant tu ne peux pas en faire un chronomètre.

dans ma source, j'utilise SetTimer pour faire le chrono, et Query pour une différence entre 2 temps

*moment T-> tu lances ton Query
*blabla tu fais des opérations
*moment T + x -> tu arrêtes le Query

donc tes opérations ont pris un certain temps, que tu peux calculer avec différence = x / fréquence

ce x est inconnu (au départ), alors que le principe du chrono est de déclencher un évènement tous les x....

un exemple avec GetTickCount (rappel, pas précis) :


Option Explicit
'
Private Declare Function GetTickCount Lib "kernel32" () As Long
'
'
Private Sub Form_Load()
Dim lDebut As Long, lFin As Long
Dim i As Long
'
lDebut = GetTickCount
For i = 0 To 10000
DoEvents
Next i
'
lFin = GetTickCount
MsgBox CStr(lFin - lDebut) & " ms"
Unload Me
End Sub


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


à toi de voir selon tes besoins ;)
++
PCPT [AFCK]
Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
0
Merci
<HR>
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command_Click()
Dim Debut As Long
Debut = GetTickCount
Do
L.Caption = CStr(GetTickCount - Debut)
DoEvents
Loop
End Sub

'Command -> Bouton sur la Form

<HR>

Le voilà mon Timer précis et sans défaut!
Merçi a toi pcpt, tu me donne espoir
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
24
0
Merci
.... sauf qu'il est pas précis, que le DoEvents (indispensable) ralenti forcément la comparaison des temps, et que tu n'atteinds jamais le End Sub
Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
0
Merci
Le DoEvents ne ralentit pas du tout le programme car j'ai tester en metant juste a côter un vrai Timer a l'interval de 1000ms qui démarre en même temps du Timer par GetTickCount . J'ai attendu pendant 5minutes apres la mise en route du chrono, et la label avec le GetTickCount et l'autre label avec le Timer Normal etait parfaitement a la même unité et syncros! Même le chronomètre de ma montre le disait. Teste toi même
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
24
0
Merci
j'ai pas dit "je suppose que", c'est un fait!!
mais çà serait pareil également juste avec "i = 3", c'est pas compliqué ; tu fais une action, elle prend un certain temps donc forcément ce temps est présent.
enfin, çà parraît logique...
de plus, un DoEvents chez toi ne prendra pas le même temps que chez un autre...
donc vraiment pas précis.

et une boucle conditionnelle sans sortie de condition, y'a besoin de tester pour savoir aussi?
ajoute MsgBox "sortie" après ton Loop, je suis certain que tu n'as pas le message.

ps : relu, un peu sec, désolé. j'ai pas voulu être "agressif"

bonne continuation
PCPT [AFCK]
Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
0
Merci
Bon j'ai du temps devant moi....

Déjà, je suis pas du tout d'accors avec toi, et j'en suis persuadé. Pour le End Sub je le sais bien qu'il n'y arrivera jamais puisque j'ai créé une boucle infini! Je sais bien aussi que DoEvents n'est pas le même pour tous les ordinateurs. Dans mon code j'ai juste oublier de marquer : Me.Refresh dans la boucle. C'etais juste pour montrer la valeur du temps.

Et juste pour prouver que tu as tore voiçi quelques preuvent :
Premier Teste :
J'ai activé mon chronomètre en même temps du chronomètre de ma montre.
J'ai joué à des jeux prenant beaucoup de mémoire vive sur mon ordinateur, j'ai bien fait exprès de bien charger quelque maps.
J'ai même mit la priorité Windows du logiciel en "Basse"!
Après 10minutes de teste, quand j'ai arrêter les deux chronomètre ils étaient tout les deux a la même unité au dixième près! (Par l'erreur humaine)
J'en déduis donc que le temps marche parfaitement.

Deuxième teste :
Je lance mon logiciel par Visual Basic, le chronomètre se met en marche. Je met le logiciel en pause grâce a VB. J'attend une veintaine de secondes. Je remet en marche le logiciel et la, pouf! mon chronomètre a augmenter de 20secondes.

J'en déduis donc que le chronomètre avec GetTickCount est très précis, et qu'il ne marche pas en fonction du lociciel mais du System. Donc le DoEvents ne changera rien!
Si tu veux vraiment que je te prouve sa en direct ajoute moi sur Msn : [mailto:Juniorm2k@hotmail.com Juniorm2k@hotmail.com] .
Je t'enverrais mon logiciel permetant de te le prouver.
Messages postés
3758
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
6
0
Merci
Si je peux amener mon grain de sel : sans parler de performance je pense comme pcpt que tu ne sors jamais de ta boucle :

Do
L.Caption = CStr(GetTickCount - Debut)
DoEvents
Loop

Il manque un while ....

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
0
Merci
J'ai dit tout a leur : "Pour le End Sub je le sais bien qu'il n'y arrivera jamais puisque j'ai créé une boucle infini!"
Tu as lu mon dernier message?! Je le sais bien qu'on ne peux pas sortir de la boucle! Et alors? Qu'est ce qu'on s'en fou de ca! (Désolé mais je vais commencé à être agressif puisqu'on me prend pour un con et qu'on comprend mal se que je dis, ou pire, on ne lit pas.)
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
24
0
Merci
re,
pour ma part, si déjà je t'ai copié un exemple concret, c'est bien parce que GetTickCount est valable.
on en revient là à la précision.

c'est pas une lutte de qui a raison ou qui a tord, tu as lu ton propre Topic?
(sous-entendu, modère tes propos envers ceux qui essaient de t'aider)

voici 2 exemples que je viens de faire :
pour le premier, j'ai un décalage de 2 secondes (période d'une minute)
pour le 2e, les commentaires expliquent.

à toi de tirer tes propres conclusions !


'[VB6]
'
'
' -------------
' EXEMPLE 1
' -------------
'
'3 labels, 1 bouton, 2 timers
Option Explicit
'
Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim lDebut1 As Long, lDebut2 As Long
'
'
Private Sub Form_Load()
Timer1.Enabled = False
Timer2.Enabled = False
Timer1.Interval = 20
Timer2.Interval = 20
End Sub
'
'
Private Sub Command1_Click()
Command1.Enabled = False
Label1.Caption = "démarré à " & Time

'init
lDebut1 = GetTickCount
lDebut2 = GetTickCount

'lance les timers, le léger décalage est compensé par début1 <> début2
Timer1.Enabled = True
Timer2.Enabled = True
End Sub
'
'
Private Sub Timer1_Timer()
Static Cpt As Long
Cpt = Cpt + 1
If Cpt = 3000 Then GoTo Sortie '1 minute

DoEvents '<- voici la seule différence, apparaissant bien sûr toutes les 20 ms
Label2.Caption = CStr (GetTickCount - lDebut1)

Exit Sub
Sortie:
Timer1.Enabled = False
Label1.Caption = "arrété à " & Time
End Sub
'
'
Private Sub Timer2_Timer()
Static Cpt As Long
Cpt = Cpt + 1
If Cpt = 3000 Then GoTo Sortie '1 minute

Label3.Caption = CStr (GetTickCount - lDebut2)
Exit Sub
Sortie:
Timer2.Enabled = False
Label1.Caption = "arrété à " & Time
End Sub

'[VB6]
'
'
' -------------
' EXEMPLE 2
' -------------
'
'1 bouton
Option Explicit
'
Private Declare Function GetTickCount Lib "kernel32" () As Long
'
'
Private Sub Command1_Click()
Dim lDebut As Long
lDebut = GetTickCount
DoEvents
MsgBox CStr (GetTickCount - lDebut) 'chez moi = 0

Dim i As Long
lDebut = GetTickCount
For i = 0 To 2000
DoEvents
Next i
MsgBox CStr (GetTickCount - lDebut) 'chez moi = soit 0, soit 10

'conclusion? super précis.... !!!
End Sub



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


PCPT [AFCK]
Messages postés
90
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
27 juillet 2009
0
Merci
Tu as rien compris a mon dernier message. La tu cherche a me montrer que DoEvents augmente le temps d'un Code. Sa je suis tout a fait d'accors avec toi. Et alors?! Franchement rajoute moi sur Msn que je t'explique tout ca, et après je te supr
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
24
0
Merci
bah si j'ai rien compris, et donc que toi oui, bah c'est tant mieux pour toi, et le vide (à tes dires) existant dans mon pauvre crâne sera alors comblé par des sujets bien plus intéressants, tant pis pour moi...

tu as posé une question, je t'ai donné des réponses qui apparemment te conviennent.
tu les as modifiées, j'ai expliqué pourquoi çà ne marchait pas, et te voilà parti sur "allez copain, on parle à deux stp, je t'explique pourquoi tu piges rien et après, j'te vire, promis"

tu parles de précision et tu te bases sur un chrono de montre (donc centièmes alors qu'on parle de millièmes).
tu compares en exemplant avec des ressources mémoire utilisées pendant l'execution de jeux alors que GetCountTick est basé sur les Ticks de l'horloge interne du processeur, donc aucun rapport avec la RAM.

tu dis que le DoEvents ne change rien au temps, ensuite que oui, etc....
1ms = 1ms. si tu es conscient que le DoEvents prend un certain temps, et que ce temps peut varier selon les configs matérielles, de la manière dont tu insistes (mais bon, c'est nous tous qui avons tord...), alors 1ms chez moi sera différent de 1ms chez toi.
donc c'est pas du temps, donc c'est faux.
désolé, tu demandes "tout" sur la précision du Timer, vas-y que j' te frotte "Bouhh, vous avez tord, mais lisez-moi euh...."

excuse-moi de l'exagération, mais c'en est souriant.

conclusion, tu as "ta" réponse (bonne ou mauvaise, apparemment, c'est pas çà le plus important)
le principal est bien qu'une réponse correcte soit donnée à une question claire.

il me semble que c'est la cas, c'est pas à nous d'interpréter ces réponses

bonne continuation et bon courage
PCPT [AFCK]
Messages postés
3758
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
6
0
Merci
Ce que je trouve con, ce n'est pas toi mais la boucle infinie.
Mais Bah, si c'est ce que tu veux, no problemo pour moi. C'est ton problème et il n'est pas besoin de devenir agressif. Et j'ai très bien lu TOUS tes messages.


Et si tu fais dans l'agressivité, moi aussi je peux le faire :

Début de l'agressivité.

Si ton truc fonctionne comme tu le veux eh be basta, mais ne reviens pas nous solliciter parce que tu as un prob ailleurs dans ton prog à cause de ça. En tous cas, ça ne fonctionnera QUE si ton "prog" se limite à ce que tu as mis dans ton post que tu t'es accepté toi-même.

D'autre part, si on te comprend mal, c'est peut-être que tu t'expliques mal. Au départ, tu poses une question sur les timer, tu as eu des réponses. Si tu veux du plus précis, sois plus précis dans ta demande initiale.

Pour finir, une question qui ne commence pas par "bonjour" ou "salut" ou équivalent, je me demande pourquoi on n'y a répondu (moi y compris). On n'est pas des chiens.

Fin de l'agressivité.

Sur ce, bonne continuation.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?