dlaczego TTimer nieprawidłowo zlicza milisekundy???mo?ż

0

stworzyłem aplikację na bazie komponentu Timer, kóra ma zliczać przez odstęp czasu 10-cio sekundowy...: milisekundy (co 1 milisekundę zwiększa zmienną x o wartość równą :1 wg wzoru : x:=x+1). Podobnie zliczane są setne sekundy (co 10 milisekund wykonywane działanie x:=x+1) Po 10 sekundach zliczania należałoby się spodziewać wyników w pierwszym przypadku 10000, zaś w drugim 1000. Tymczasem jest: 203 i 183. Dlaczego???


0

Wydaje mi się, że tutaj ma znaczenie szybkość zegara w komputerze. Nie wyrzuca ci TTimer.OnTimer co 1 milisekundę, tylko za każdym razem, gdy zegar zmieni swoją pozycję. Nie jestem pewien, ale wydaje mi się, że ma to bezpośredni związek z szybkością procesora, ale nie jestem specem od sprzętu, więc nie dam głowy.

0

Ja rowniez nie jestem ekspertem, ale moja opinia jest nastepujaca. Timer jest mechanizmem systemowym, zas windows nie jest systemem czasu rzeczywistego i timing zdarzen jest dosc nieprzewidywalny. Zeby Twoja aplikacja "zauwazyla" uplyniecie kolejnej miliskeundy (czy 10 ms) musza zajsc nastepujace zdarzenia. System musi przejrzec zainstalowane aktualnie timery, w tym Twoj i stwierdziwszy, ze nadszedl czasl, wyslac komunikat do Twojej aplikacji. Twoja aplikacja, kiedy nadejdzie na nia czas, odbierze ten komunikat i zareaguje zwiekszeniem licznika. Nastepny komunikat system wysle gdy znow bedzie przegladla timery. Poniewaz w tym samym czasie system zajmuje sie kupa innych rzeczy, dzialaja inne aplikacje, wiec miedzy kolejnymi komunikatami uplywa zapewne kilka-kilkadziesiat a w niesprzyjajacych warunkach wiecej ms.

0

TTimer nie potrafi liczyć co 1 ms. Jego rozdzielczość dla dosopochodnych windoz to ok. 55 ms, dla NT ok. 10 ms, a więc i tak dużo więcej niż byś chciał. Ma to związek raczej z przerwaniem zegara niż szybkością procesora.

Do mierzenia krótkich czasów można użyć zegara wysokiej dokładności (High Performance Timer). Jest to licznik uzupełniany ze stałą i bardzo dzużą częstotliwością.
Funkcja QueryPerformanceFrequency(var x:Int64) podaje częstotliwość uzupełniania, a QueryPerformanceCounter(var x:Int64) aktualny stan tego licznika. Przy ich pomocy można mierzyć czasy rzędu mikrosekund, a więc 1000 - 10000 razy krótsze niż TTimer (HPT zależy od posiadanego sprzętu).

0

Dziękuję za profesjonalną odpowiedż i spróbuję coś z tego zrobić. :)
kl

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