Le problème vient du Sleep qui manque de précision (épargnez-moi les jeux de mots éculés SVP )
Le mieux est d'utiliser QueryPerformanceFrequency et QueryPerformanceCounter. Le problème de ces fonctions est qu'elles utilisent une base de temps différente selon le CPU et l'OS. Mais l'essentiel est d'avoir deux bases de temps, et pour l'autre on peut prendre le compteur de cycle interne (rdtsc), l'idée étant d'avoir deux deltas, un pour chaque base.
Donc :
- tu te mets en priorité maximale (comme tu l'as fait)
- tu récupères la fréquence du QPC :
LARGE_INTEGER pf;
QueryPerformanceFrequency(&pf);
- tu prends une mesure des deux compteurs :
LARGE_INTEGER valeur0;
float ticks0;
QueryPerformanceCounter(&valeur0);
__asm{
rdtsc
mov ticks0, eax
}
- tu attends qques ms pour obtenir des deltas corrects, en utilisant une boucle de calcul par exemple... sa durée n'importe pas du tout dans la précision du calcul.
- tu reprends à nouveau une valeur des deux compteurs.
LARGE_INTEGER valeur1;
float ticks1;
QueryPerformanceCounter(&valeur1);
__asm{
rdtsc
mov ticks1, eax
}
- et voilà, la fréquence en Hz vaut :
freq = (float)(ticks1-ticks0) * pf.LowPart / (valeur1.LowPart - valeur0.LowPart).
- tu te remets en priorité normale (comme tu l'as fait)
Avec un P2 ou un P3 sous NT, QueryPerformanceFrequency renvoie directement la fréquence du cpu, mais le calcul fonctionne quand même, car alors les deux deltas sont égaux.
oilà oilà ...
[edit]--Message édité par z51--[/edit]