Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » QueryPerformanceCounter bzw. QueryPerformanceFrequency

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.10.2008, 17:20 Uhr
Daniel A



Servus,

ich versuche gerade die folgende funktion zu verstehen. Ich komme leider mit den mit x versehenen Zeilen nicht klar!!! Wieso wird nämlich die Frequenz durch 100000 geteilt und was die Bedingungen in der While-Schleife bedeuten soll...

Danke im Voraus,

Dan

void uSleep(unsigned long us)
{

static __int64 start, curr, freq;

if(!freq) {
QueryPerformanceFrequency(&freq);
freq /= 1000000UL; xxxxxxxxxxxxxxxxxxxxxxxxxx
}

QueryPerformanceCounter(&start);
do
QueryPerformanceCounter(&curr);
while (us > (curr - start) / freq); xxxxxxxxxxxxxxxxxxxxxxxxxx

Dieser Post wurde am 11.10.2008 um 17:21 Uhr von Daniel A editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: