[delphi] przeróbka procedury z Timer na QueryPerformance...

0

Witam

Mam taką oto procedurę odpowiedzialną za generowanie pewnych zdarzeń (tutaj akurat zmianę Caption etykiety) w danych odstępach czasu. Został użyty do tego celu komponent Timer. Niestety okazało się, iż nie jest on zbyt dokładny do tego co chciałbym uzyskać, a mianowicie do odliczenia i uzyskania czasu rzędu kilku - kilkunastu milisekund.
Wiem, że prawdopodobnie skorzystanie z funkcji QueryPerformanceFrequency(); i QueryPerformanceCounter(); dałoby efekt przynajmniej dużo bardziej zbliżony do oczekiwanego (tak wiem, zaraz rozlegną się głosy, iż Windows to nie RTOS... ;-). Problem w tym, że za bardzo nie wiem jak pod te dwie funkcje "przerobić" moją aktualną procedurę.

Poniżej ją zamieszczam (czasy w ms).

Może ktoś mi pomoże?

Zmienne:
t := 1000; // ale niech to będzie opóźnienie startu
tn := 5; // co jaki czas ma zachodzić zdarzenie
tz := 3; // ile czasu ma trwać zdarzenie
tr := 10; // ilość cykli

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  if t > 0 then // aktywne opóźnienie
  begin
    t := 0; // anuluj opóźnienie
    Label1.Caption := 'Komunikat początkowy';
    Timer1.Interval := tn; // czas, za jaki ma zachodzić zdarzenie
    Timer1.Enabled := True;
  end else
  begin
    if Timer1.Tag = 0 then
    begin
      Timer1.Interval := tz; // ile czasu ma trwać zdarzenie
      Label1.Caption := 'Komunikat 1';
    end else
    begin
      Timer1.Interval := tn; // czas, za jaki ma zajść kolejne zdarzenie
      Label1.Caption := 'Komunikat 2';
    end;
    Timer1.Tag := Timer1.Tag xor 1; // przełącznik cyklu
    Dec(tr); // dekrementacja licznika
    if tr > 0 then
      Timer1.Enabled := True
    else
      Label1.Caption := 'Komunikat końcowy';
  end;
end; 

TIA

Pozdrawiam

Wojtek

0

kiedys tez potrzebowalem robic cos bardzo czesto.
Jednak Windows liczy czas z dokladnoscia do 10ms.
(czasem uda sie zlapac mniejszy kawalek czasu - ale sa to przypadki)

Udalo mi sie odliczac mniejsze, rowne kawalki czasu
robiac petle i sprawdzajac getTickCount ale taka petla pochlaniala 100% procesora

dlatego zmienilem koncepcje...

Ale jak bys znalazl rozwiazanie to chetnie przeczytam

0
Johny_Morfina napisał(a)

Udalo mi sie odliczac mniejsze, rowne kawalki czasu
robiac petle i sprawdzajac getTickCount ale taka petla pochlaniala 100% procesora

Witam

A tak konkretnie to jak Ci się tego udało dokonać? Dla mnie to bez znaczenia - moze być nawet 120%... ;-)

Pozdrawiam

Wojtek

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