Temps reel / WinXP, comportement etrange

Temps reel / WinXP, comportement etrange - Divers - Programmation

Marsh Posté le 04-03-2007 à 09:30:26    

Bonjour,
je realise un programme qui doit communiquer avec une carte d'acquisition video. Lorsqu'une nouvelle image arrive, le pilote de la carte d'acquisition appelle un callback. L'ecart de temps entre les appels de ce callback devrait etre de 40ms, puisque c'est la periode a laquelle les images sont envoyees. Or il se trouve que les mesures sont tres bizarres, et dependent du fait que Windows Media Player soit lance ou non. Au depart je n'y croyais pas, mais j'ai repete l'experience de nombreuses fois, et le phenomene se reproduit systematiquement :
 
Si WMP n'est pas lance, les ecarts sont les suivants:
OnFrame : 23ms
OnFrame : 57ms
OnFrame : 23ms
OnFrame : 57ms
....
 
Par contre si on lance WMP, ca change tout, et ca devient plus precis:
OnFrame : 40ms
OnFrame : 39ms
OnFrame : 40ms
OnFrame : 40ms
OnFrame : 41ms
OnFrame : 40ms
....
 
Je precise que je mesure le temps avec timeGetTime, le priority boost lie aux interruptions est actif, j'ai donne a mon processus et a mon thread la priorite maximale (REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_TIME_CRITICAL), et que ca marche meme si WMP n'est pas en train de jouer un fichier (il suffit qu'il soit lance).
 
Est-ce que ceux d'entre vous qui auraient deja touche a des problemes de timing ont deja rencontre ce comportement? Comment le reproduire ? Mon hypothese, c'est que WMP doit provoquer le basculement d'un parametre de l'OS affectant toutes les applications.

Reply

Marsh Posté le 04-03-2007 à 09:30:26   

Reply

Marsh Posté le 04-03-2007 à 20:51:04    

Je dis ça totalement au pif, mais t'aurais pas un processeur qui change de vitesse selon la charge par hasard ? (Charge que WMP arrive à maintenir suffisement haut pour éviter des switch rapide/lent tout au long de ton acquisition)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 05-03-2007 à 23:35:37    

Bon, j'ai trouve ... mais je pensais pas devoir descendre aussi profond.
Dans l'api du noyau de Windows XP, il y a une fonction ExSetTimerResolution qui sert a fixer la frequence de ... quelque chose. Je n'ai pas compris quoi exactement, mais c'est effectivement un parametre qui affecte toutes les applications qui tournent, et plus il est bas, plus la precision temporelle est grande.
 
Verification faite, puisque cette fonction renvoie l'ancienne valeur du parametre, j'ai pu tester sa valeur avec ou sans WMP. Et bingo, quand WMP est lance, le parametre est divise par 10. WMP doit indirectement provoquer le chargement d'un driver qui change la valeur du parametre.
 
J'ai donc resolu mon probleme en codant un micro-driver qui regle ce parametre a son chargement et le restaure au dechargement...
 
On m'y reprendra a vouloir faire du temps reel sous Windows ... :sarcastic:

Reply

Marsh Posté le 06-03-2007 à 09:17:55    

[:drapal], ca peut servir :jap:


Message édité par _darkalt3_ le 06-03-2007 à 09:18:08

---------------
Töp of the plöp
Reply

Marsh Posté le 09-03-2007 à 21:04:50    

^Oui, en effet!

Reply

Marsh Posté le 10-03-2007 à 10:16:36    

Si il y en a qui veulent mon driver, ils n'ont qu'a me demander.  
C'est juste un truc simplissime qui permet d'appeler la fonction ExSetTimerResolution depuis le mode utilisateur ...

Reply

Marsh Posté le 10-03-2007 à 13:06:27    

Ca me fait penser a un article que j'ai lu et qui expliquait l'influence de l'affichage d'une page de bourse de yahoo sur les perfomances multimedia: en fait cette page affichait une sorte de graphique qui changeait la resolution du timer multimedia et le rendait ainsi beaucoup plus fin.
 
Bon en fait c'est pas vraiment ca mais ca a peut etre le meme genre d'effet, voici la page en question: http://www.codeproject.com/tips/YahooSpeeds.asp


Message édité par breizhbugs le 10-03-2007 à 13:09:00
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed