Błędny pomiar czasu

0

Witam. Piszę timer lekko na wzór tego: http://mzrg.com/qqtimer/ . Otóż utknąłem na błędnym pomiarze czasu przez komponent Timer w C++ Builderze versji 6. Mianowicie czas jest o wiele opóźniony ( dla przykładu 5.50s czasu rzeczywistego odpowiada 3.40 czasu zmierzonego -> im dłużej tym zwiększa się rozbieżność ). Czy może być to spowodowane moją przedpotopową jednostką komputerową? :P Dodam, że timer, do którego link podałem mierzy czas bez zarzutu :>.

0

Jeżeli komponent TTimer źle mierzy ci czas oznacza że go niepoprawnie użyłeś.

0

Standardowo interval ustawiony jest na 1000, zależy mi na milisekundach więc ustawiam interwał na 10 - zauważyłem że pomimo ustawienia go na 1 operacja przypisania do zmiennej int czas += 1 a następnie wypisania jej do Label'a jako tekst zajmuje tyle samo co interwał 10. Z tego wnioskuje, że jednak przeciąża mi to w jakiś sposób kompa, bo czas liczony jedynie w sekundach ( interwał 1000 ) daje prawidłowy wynik wraz z czasem rzeczywistym :)

0

Jeśli interwały są zbyt krótkie to timer może się opóźniać. Na ile masz ustawione?
No właśnie 10ms to znacznie za mało.

//Edycja:
Zapisz sobie gdzieś moment rozpoczęcia mierzenia czasu i w niedokładnym timerze od obecnego czasu odejmuj sobie tą wcześniej zapisaną wartość - w ten sposób zostanie wyliczony czas jaki upłynął na daną chwilę i to dokładny, nawet jeśli aplikacja by się zawiesiła na jakiś czas.

1

Timer ma rozdzielczość 18.2ms (1h/65536), ponadto system nie gwarantuje, że timer będzie wywoływany z dokładnymi interwałami. Jeśli procesor będzie zajęty przez inne wątki, opóźnienia mogą być bardzo duże. A im mniejsze interwały, tym błędy robią się grubsze, przy np. 20ms sięgając ~50%. Z tych powodów timer do pomiaru czasu kompletnie się nie nadaje. Robi się to zupełnie inaczej: przy starcie timera zapisujesz gdzieś czas jego uruchomienia, potem co cyknięcie pobierasz aktualny czas i odejmujesz od niego czas zapamiętany, co daje Ci zawsze (z jednym rzadkim wyjątkiem - zmiany godziny/daty, gdy czas "przyspiesza" albo "zwalnia") dokładny czas działania timera, niezależnie od opóźnień i błędów wynikających z rozdzielczości timera systemowego.

0

Dzięki wielkie, całkowicie wyleciały mi z głowy możliwości biblioteki <ctime>. Problem rozwiązany za pomocą funkcji Clock() oraz funkcji reprezentującej otrzymany wynik 1/1000s w postaci ciągu znaków, która zostaje wywoływana TTimer'em co pewny interwał oraz po zakończeniu :).

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