Wykonaj o dokładnej godzinie – jak?

0

chciałbym by mój program dokładnie o godzinie np. 1100 wykonał pewną akcję. To co napisałem w moim przypadku się nie sprawdza, program się spóźnia czasami nawet pół sekundy na co nie mogę sobie pozwolić.

procedure TForm1.Timer2Timer(Sender: TObject);
var
 Present : TDateTime;
 Hour, Min, Sek, MSec : Word;
 a,b,c:Word;
begin
 a:=strtoint(edit10.Text);
 b:=strtoint(edit11.Text);
 c:=strtoint(edit12.Text);
 Present := Now;
 DecodeTime(Present, Hour, Min, Sek, MSec);
 if (Hour = a) and (Min = b) and (Sek = c ) then
 begin
      label1.Caption:='stop';
 end
end;

zależy mi by akcja była wykonana najdokładniej jak się da względem zegara systemu

0

Może dołożyć jeszcze warunek MSec = 0

0

Jeśli timer ma interval np. 1000 to się zdarzy pewnie, że będzie tak: 1149 i pół sekundy - interal, a potem 1150 i pół sekundy więc się minie.

0

Nie no, chyba nie ustawił tak dużego intervala skoro chce mieć taką dokładność. Chociaż różnie bywa ... ;)

0
-=arhi=- napisał(a)

Nie no, chyba nie ustawił tak dużego intervala skoro chce mieć taką dokładność. Chociaż różnie bywa ... ;)

Z tego, co pamiętam, to interwał <100 nie działa. Tzn timer wtedy idzie i tak z interwałem 100. W każdym razie co robisz, że Ci tak bardzo na pół sekundzie zależy?

I w takim wypadku jak najmniej kodu w onTimer.

// to źle pamiętasz - maksymalna rozdzielczość timera to około 18ms - Ł

0

Mógłby w timerze modyfikować interval w zależności ile mu pozostało, bo jeśli jeszcze ma być godzina to niech interval będzie 60000, jak zostanie 30 minut to interval 30000, a jak zostaniesz mniej niż 30 sekund to dopiero wtedy dać interavl:=0

0
-=arhi=- napisał(a)

Nie no, chyba nie ustawił tak dużego intervala skoro chce mieć taką dokładność. Chociaż różnie bywa ... ;)

no tak przyznaje program pisałem jakis czas temu i nie zwróciłem na to uwagi intervala miałem ustawionego domyślnie :/ . Szczerze mówiąc to byłem pewien że warunek wystarczy i jesli sekuna będzie sie zgadzać to true :-|
po zmianie interval jest dużo lepiej ale te ~100ms to jeszcze za dużo

dzięki za pomoc :-)

0
Force napisał(a)

Mógłby w timerze modyfikować interval w zależności ile mu pozostało, bo jeśli jeszcze ma być godzina to niech interval będzie 60000, jak zostanie 30 minut to interval 30000, a jak zostaniesz mniej niż 30 sekund to dopiero wtedy dać interavl:=0

czy to cos da jesli interwał ma <100 ?

0

Windows to nie system czasu rzeczywistego. Przy dużej zajętość procka albo kolejki komunikatów, nawet z taką dokładnością interval, kompletnie nic nie gwarantuje Ci obsłużenia zadania w ramach konkretnej sekundy, o milisekundach nie wspominając.

Podany interwał to pobożne życzenie wobec systemu.

0

A jakby zrobić na wątku, z wykorzystaniem Eventów i metody WaitFor z małym interwałem, + podniesienie priorytety wątku ?

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