Bonjour,
Je cherche une méthode *fiable* pour faire des pauses précises au 1/10 de milliseconde (voire à 1 milliseconde).
J'ai exclu usleep qui est d'une précision ridicule (ne descend pas en dessous de 15 ms, sauf si j'indique usleep(1), alors là le temps d'attente varie de 1/2 à 1 microseconde.
La seule solution que j'ai trouvé actuellement est d'utiliser l'interruption RDTSC des x86 et faire une boucle d'attente. Cette interruption indiquant un nombre de cycles d'horloge, il me faut une base de temps (nombre de cycles pour une période donnée).
Je procède donc comme suit :
je récupère une 1ère valeur d'horloge
je fais un "usleep(500000)" qui semble être assez précis pour cette durée
je récupère la 2ème valeur d'horloge
j'en déduit un nombre de cycles pour une micro-seconde, et enfin, je peux faire une boucle d'attente.
Cette solution ne me convient cependant guère, d'une part parce que cela occupe 100% du cpu, d'autre part car je me base sur le fait que usleep(500000) est toujours juste (ce qui n'est apparement pas le cas sur un vieux portable PIII) et que la frequence du cpu ne varie pas (ce qui est faux par exemple sur une plateforme centrino).
Je cherche donc une solution plus fiable, et m'en remet à vos conseils.
Je précise que je dois faire un code compilable pour windows et linux.
Note : J'ai tenté de voir comment procedait la librairie LiveMedia (utilisée par VLC pour le streaming) pour appliquer le delai d'attente entre deux paquets. Mais je n'arrive pas à saisir comment cela fonctionne. (S'il y en a qui connaissent, je pense que ça se passe dans DelayQueue.cpp)
Partager