001
23.10.2008, 13:54 Uhr
zac
|
Die Funktion funktioniert wohl so: Sie hat 3 statische Variablen, die also Funktionsaufrufe überleben. Darin speichert sie die Taktfrequenz wenn diese noch nicht bereits gesetzt ist (wobei ich es nicht toll finde, dass sich das Ding darauf verlässt, dass static Variablen ohne weiteres 0-initialisiert sind) (ich vermute mal die Division hängt damit zusammen was QueryPerformanceFrequency zurückgibt und wie oft das in eine Sekunde geht, ich vermute mal, 1.000.000 mal).
Die Schleife arbeitet etwa so: Zuerst wird der Startpunkt bestimmt. Die Schleife läuft wohl so lange wie us angibt (in Sekunden). (curr-start)/freq ist dann also wohl die Anzahl der Sekunden die er bereits schläft - macht ja auch Sinn. Und die Schleife läuft halt so lange, wie er noch nicht länger oder genauso lang geschlafen hat wie als Parameter übergeben. Ob es Sinn macht, die Funktion Sleep so zu basteln, darf allerdings bezweifelt werden - denn, so wie ich das sehe, wird die Rechenzeit in der die Schleife läuft, nicht für andere Threads zur Verfügung gestellt... Normalerweise sorgt Sleep glaube ich durch den Aufruf von KeDelayExecutionThread im Ring0 (syscall oder wie auch immer int 0x2e in Windows heißt) dafür, dass der Task der die Funktion aufgerufen hat, einfach nicht mehr aufgerufen wird... -- mov eax,0f9h push 2 push 2 mov edx,esp int 2eh Dieser Post wurde am 23.10.2008 um 14:02 Uhr von zac editiert. |