Salut,
je voudrais ameliorer la fluidité de mon programme , mais il se limite au timer qui au plus vite va a 1 milliseconde d'interval.
qq1 a-t-il une solution pour aller plus vite que le timer ?
merci
Salut,
je voudrais ameliorer la fluidité de mon programme , mais il se limite au timer qui au plus vite va a 1 milliseconde d'interval.
qq1 a-t-il une solution pour aller plus vite que le timer ?
merci
Je ne crois pas que tu peux avoir plus rapide dans le style d'une Timer. Il y a l'API GetTickCount, mais elle se limite au millième de seconde aussi.
@+
Si la machine le supporte, tu peux utiliser le compteur de performance. La précision peut descendre largement en-dessous du millionième de seconde.
QueryPerformanceCounter permet de connaître la valeur actuelle du compteur, et QueryPerformanceFrequency le nombre d'itérations du compteur en une seconde (à multiplier par 10000 à cause du type Currency, utilisé ici pour les besoins de la cause -ces deux fonctions attendent des entiers non signés sur 8 octets).
Ci-dessous un test avec un intervalle d'un dix-millième de seconde.
Bonne chance !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Private Declare Function QueryPerformanceFrequency Lib "Kernel32" _ (lpFrequency As Currency) As Long Private Declare Function QueryPerformanceCounter Lib "Kernel32" _ (lpPerformanceCount As Currency) As Long Const Intervalle As Double = 0.0001 ' Intervalle, en fraction de seconde Const Délai As Long = 5 ' Temps total du test, en secondes Private Sub Command1_Click() Dim T1 As Currency, T2 As Currency Dim Pas As Currency, Freq As Currency Dim Chrono As Single, I As Long If QueryPerformanceFrequency(Freq) = 0 Then MsgBox "Compteur de performance non supporté.", vbInformation Exit Sub End If Pas = Freq * Intervalle Chrono = Timer QueryPerformanceCounter T1 Do While I < Délai / Intervalle QueryPerformanceCounter T2 If T2 - T1 > Pas Then ' Intervalle écoulée T1 = T2 I = I + 1 End If Loop MsgBox "Temps écoulé : " & Timer - Chrono & vbLf & vbLf & "Itérations : " & I End Sub
Pour compléter la réponse de bazoom :
Dans le cas du timer comme de l'API GetTickCount, c'est la résolution qui est à la millisecondes. La précision est très au-dessus.
De mémoire je crois que la précision du timer est 1/17 s et celle de GetTickCount d'environ 1/30 s.
Seules les appels aux API montré par bazoom permettent une précision réelle.
A lire sur le sujet
http://haypo.developpez.com/article/frequence_cpu/
Il parait que ce contrôle Timer modifié donne aussi une précision réelle. A vrai dire, j'ai juste vérifié qu'il fonctionnait sans pousser jusqu'au test de performance (je n'en ai pas encore eu besoin dans un programme).
Par contre, il est aussi limité à 1ms...
merci a tous mais je n'arrive pas avec la solution de bazoom a faire une fonction qui se comporte comme un timer, que tout les dix-millioniemede seconde ça m'appele une sub ou que ça m'execute un code
j'arrive toujourspas a faire marcher le code, en fait, il compte et apres il met le nombre d'iterations qu'il a fait moi ce que je voudrais c'est un truc qui me declenche un code a caque iteration
Hello,
Il faut que tu mettes le code à l'intérieur de ce bloc If/End If :
La variable I ne sert à rien, je l'ai utilisée uniquement pour faire le test. La seule chose dont tu as besoin pour mettre en oeuvre cette fonction c'est de savoir que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 If T2 - T1 > Pas Then ' TON CODE ICI... T1 = T2 End If
... met dans la variable T2 la valeur actuelle du compteur de performance. Après, il faut que tu adaptes ça à tes propres besoins.
Code : Sélectionner tout - Visualiser dans une fenêtre à part QueryPerformanceCounter T2
QueryPerformanceCounter n'offre qu'une temporisation, de la même manière que GetTickCount. Ce n'est pas un Timer au sens propre du terme. Tu peux t'inspirer d'exemples basés sur GetTickCount, l'utilisation est quasiment la même.
Une temporisation inférieure au dix millionième de seconde ça me semble excessivement court, à moins que ton code soit extrêmement rapide à l'exécution ou que ta machine soit une vraie bombe. :-)
Bonne chance ! :-)
ok, merci, je vais essayer
PS: dsl pour reponse tardive ( j'etais en vacances )
Merci de mettre la tag [Résolu] la prochaine fois...
Pkoi "si la machine le supporte" ?Envoyé par Bazoom
Parce que, dixit le SDK, "The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists.... If the installed hardware supports a high-resolution performance counter, the return value is nonzero." Je n'en sais pas plus.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager