MouLeT
Messages postés90Date d'inscriptionsamedi 11 octobre 2003StatutMembreDernière intervention27 juillet 2009
-
26 oct. 2005 à 20:09
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 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é)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 26 oct. 2005 à 22:56
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]
MouLeT
Messages postés90Date d'inscriptionsamedi 11 octobre 2003StatutMembreDernière intervention27 juillet 2009 27 oct. 2005 à 10:50
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
MouLeT
Messages postés90Date d'inscriptionsamedi 11 octobre 2003StatutMembreDernière intervention27 juillet 2009 27 oct. 2005 à 13:24
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)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 27 oct. 2005 à 13:56
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
MouLeT
Messages postés90Date d'inscriptionsamedi 11 octobre 2003StatutMembreDernière intervention27 juillet 2009 27 oct. 2005 à 18:48
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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 27 oct. 2005 à 18:55
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"
MouLeT
Messages postés90Date d'inscriptionsamedi 11 octobre 2003StatutMembreDernière intervention27 juillet 2009 27 oct. 2005 à 20:18
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.
MouLeT
Messages postés90Date d'inscriptionsamedi 11 octobre 2003StatutMembreDernière intervention27 juillet 2009 27 oct. 2005 à 20:49
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.)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 27 oct. 2005 à 21:14
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
'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
MouLeT
Messages postés90Date d'inscriptionsamedi 11 octobre 2003StatutMembreDernière intervention27 juillet 2009 27 oct. 2005 à 21:49
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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 27 oct. 2005 à 22:09
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
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 27 oct. 2005 à 22:19
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 !?