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?