Błąd przy odmierzaniu czasu

0

Potrzebuję zrealizować timer i odmierzanie czasu, ponieważ sam timer nie wystarczy, błąd się ujawnia w przypadku, gdy procedura związana z timerem wykonuje się dłużej niż okres timera.

Innymi słowy, możliwa jest sytuacja, że nie za każdym razem wykona się procedura związana z timerem, jednym z elementów tej procedury jest wyświetlenie i zerowanie licznika iteracji pętli pracującej w osobnym wątku.

W takim razie postanowiłem wykonywać pomiar czasu między poszczególnymi wykonaniami procedury związanej z timerem. Niby wszystko jest w porządku, ale jest jeden mały problem z samym timerem, który przedstawiam poniżej.

Zrobiłem jedną próbę. Na formularzu są położone przycisk, etykieta i timer.

A kod wygląda następująco:

        DateTime T1 = new DateTime();
        DateTime T2 = new DateTime();
        TimeSpan T = new TimeSpan();

        private delegate void Del();

        private void timer1_Tick(object sender, EventArgs e)
        {
            T2 = DateTime.Now;
            T = T2 - T1;
            T1 = DateTime.Now;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = (T.TotalMilliseconds).ToString();
        }

Już wcześniej stwierdziłem, że metoda DateTime.Now; zwraca aktualną godzinę z większą dokładnością niż jedna milisekunda. Mi wystarczy dokładność do jednej milisekundy.

Wyświetlanie okresu zrealizowałem osobno, żeby wyeliminować aktualizację formularza jako możliwą przyczynę problemu.

Problem polega na tym, że okres Timera (parametr Interval) tak naprawdę jest zaokrąglany w górę do wielokrotności 15,625 milisekund. Jeżeli ustawię 17 milisekund jako Interval, to wyświetla się czas 31,25.

Gdzie jest przyczyna problemu i z jakiego powodu następuje to zaokrąglanie do wielokrotności 15,625ms? A sama liczba 15,625 milisekund to skąd się bierze?

0

W przypadku Stopwatch, to rejestrowany pomiar jest zmienny, rozrzutność +/- 7 milisekund, średni czas, gdyby wyliczyć, też jest zaokrąglany do wielokrotności 15,625ms. Przy timerze ustawionym na 5ms rejestrowano czas od ok. 7ms do ok. 21ms.

        TimeSpan T = new TimeSpan();
        Stopwatch S = new Stopwatch();

        private void timer1_Tick(object sender, EventArgs e)
        {
            S.Stop();
            T0 = S.Elapsed;
            S.Reset();
            S.Start();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = (T.TotalMilliseconds).ToString() + "  " + (T.Ticks).ToString();
        }
0

Miało być tak:

        TimeSpan T = new TimeSpan();
        Stopwatch S = new Stopwatch();

        private void timer1_Tick(object sender, EventArgs e)
        {
            S.Stop();
            T = S.Elapsed;
            S.Reset();
            S.Start();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = (T.TotalMilliseconds).ToString() + "  " + (T.Ticks).ToString();
        }
0

Wniosek jest taki, że to czas interwału timera jest zaokrąglany i nieprawidłowy

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