Timer o dużej rozdzielczości

0

Witam,
szukam sposobu na wykonanie pętli z opóźnieniem rzędu 0,01ms.

Z tego co znalazłem w internecie (może komuś przyda się takie zestawienie...):
-zwykłe Sleep(1) daje min. 10ms przerwę
-to samo Sleep(1) z wywołanym wcześniej timeBeginPeriod(1) daje przerwę 1ms (i to nawet całkiem dokładnie, po milionie przebiegów pętli program spóźnił się mniej niż sekundę)
-kombinacja z QueryPerformanceFrequency i QueryPerformanceCounter i sprawdzanie czy minęło już wystarczająco taktów procesora, teoretycznie bardzo duża dokładność, zaobożerność też duża

-i czwarta opcja, o której nie za wiele wiem i nie mogę znaleźć:
Windowsowy Timer Multimedialny
w internecie odsyłają tutaj: http://msdn.microsoft.com/en-us/library/windows/desktop/dd742877%28v=vs.85%29.aspx
a stamtąd:
http://msdn.microsoft.com/library/ms644906.aspx
http://msdn.microsoft.com/library/ms682492.aspx
wiem że z tą metodą da się wykonywać pętlę z częstotliwością ok 25kHz (jeden specjalistyczny program takie wyniki tą metodą osiąga).
Może wie ktoś coś więcej o tej metodzie? Jakieś linki lub przykłady mile widziane ;)

pozdrawiam
Paweł Lis

0

Spróbuj jeszcze z tym, tylko, że:

  • ta metoda działa tylko z procesorami Intela ?
  • musisz przetworzyć sobie ilość cykli na czas
procedure Test;

  function TimeStampCounter: Int64;
  const
   D32 = $66;
  var
   TimeStamp: record
    case Byte of
      1: (Whole: Int64);
      2: (Lo, Hi: LongInt);
    end;
  begin
   asm
    rdtsc
    {$ifdef Cpu386}
    mov [TimeStamp.Lo], eax
    mov [TimeStamp.Hi], edx
    {$else}
    db D32
    mov word ptr TimeStamp.Lo, AX
    mov [TimeStamp.Hi], eax
    db D32
    mov word ptr TimeStamp.Hi, DX
    mov [TimeStamp.Hi], edx
    {$endif}
   end;

   Result := TimeStamp.Whole;
  end;

const
 n = $FFFFFFF; //Liczba powtórzeń. Im większa tym lepsze porównanie
var
 i: Integer;
 TimeStart, TimeEnd: Int64;
begin
 TimeStart := TimeStampCounter;

 for i:= 0 to n do //Operacja do wykonania
   
 TimeEnd := TimeStampCounter;
 ShowMessage('Średnia liczba cykli potrzebnych na wykonanie operacji '+ FloatToStr((TimeEnd - TimeStart)/n));
end;
0

uElapse [in]
The time-out value, in milliseconds.
Czwartą metodą tego nie osiągniesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1