Bonjour à tous
Je cherche à attendre EXACTEMENT 60 micro secondes.
J'ai fait cette routine mais elle me bouffe 50% du temps CPU du fait que je dois l'appeler 1000 fois par secondes (j'en ai besoin pour communiquer avec une carte électronique connectée sur LPT1) :
// Compilé sous VC 6.0 SP 5 void udelay(unsigned int delay) { unsigned __int64 nCtr=0, nFreq, nCtrStop; QueryPerformanceFrequency((LARGE_INTEGER*)&nFreq); QueryPerformanceCounter((LARGE_INTEGER*)&nCtrStop); nCtrStop+=(__int64)((nFreq*(__int64)(delay-3))/1000000); for(;nCtr<nCtrStop;) QueryPerformanceCounter((LARGE_INTEGER*)&nCtr); return; }
|
Je cherche un moyen de dire au kernel de Windows que pendant cette attente, il doit passer le controle à un autre thread comme le fait la fonction Sleep que jai essayée.
Le problème c'est que Sleep ne fonctionne que par pas de 10 ms sur NT (alors moi qui veut 60µs ....)
Je sais aussi qu'il existe la fonction NtDelayExecution, qui permet d'attendre en 100nanosecondes (Waow !!) mais elle aussi ne fonctionne que par pas de 10 ms :-((
Donc si quelqu'un peut me proposer une fonction attendant 60 µs sans consommer de temps CPU (ou tres peu) ou si on peut me dire comment régler le pas d'attente de NtDelayExecution ... je suis preneur.
Merci à ceux qui me répondent !
PS : NtDelayExecution est une fonction non documentée de WinNT dont le prototype est (à peu près) :