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