Skocz do zawartości

Visual Basic - timer tyka nieregularnie


Ania

Rekomendowane odpowiedzi

Mam taki problem z timerem w visual basic, ma tykac co 100 ms, ale tyka nieregularnie.

 

 

Dim zeit As System.DateTime

Dim zeitstr As String

 

'timer o nazwie uhr:

Private Sub uhr_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles uhr.Tick

 

zeit = Now

zeitstr = zeit.Minute & ":" & zeit.Second & ":" & zeit.Millisecond

lstTimes.Items.Add(zeitstr)

 

End Sub

Czyli w tej chwili prawie nic nie musi liczyc, tylko pisac do listy o imieniu lstTimes.

Timer interval jest ustawione na 100 ms.

Mimo to lista wyglada w ten sposob (widac ze odstepy czasowe sa inne niz te 100 ms)

(min:sec:millisec)

timeszg1.jpg

w243.png

 

Co jest przyczyna, i jak mozna zrobic zeby on wywolywal akcje regularnie? (efektem koncowym ma byc wyczytywanie i analizowanie videostreamu co 100 ms)

Edytowane przez Ania
Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 10
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

Z gory sie przyznam ze o Visual Basicu wiem tyle, ze jest, ale ten problem przypomina mi zgryz z innym jezykiem skryptowania (JavaScriptem). Tam tez timery sa niedokladne, bo nie leca w osobnym watku (http://ejohn.org/blog/how-javascript-timers-work/ - tutaj dokladny opis). Ponoc wiekszosc przegladarek przedluza zwykle delay o pare milisekund, tak jak to sie dzieje u ciebie.

  • Like 1
Odnośnik do komentarza
Udostępnij na innych stronach

Ex3, dzielisz sekundy przez 1000? i co dalej?

 

Jeszcze potem próbowałam coś podobnego:

Zamiast timera zrobiłam loop który sobie leciał aż Now.Milliseconds się podniosło o 100,

ale też wychodziło źle o kilka milisekund. Loop potrzebował trochę dłużej niż powinien.

Co dziwne, jak miał robić to co 500 albo co 1000 ms, to wychodziło prawidłowo, a jak inne czasy np. 100, 200, 800 ms to wychodziło źle o 3-16 ms.

 

Dzięki za linki, przeglądne, mam nadzieję że będzie się dało jakoś przełożyć na VB.

Edytowane przez Ania
Odnośnik do komentarza
Udostępnij na innych stronach

Ja używałem tego do zrobienia prostego zegarka wskazówkowego.

Wszystko oczywiście inicjowane w pierwszej klatce animacji, w drugiej wywoływane i w trzeciej wywołanie i powrót do drugiej.

Math.round(getTimer()/1000) zwraca ilość sekund od uruchomienia programu.

Potem ilość sekund używałem do liczenia kątów dla wskazówek ;)

Odnośnik do komentarza
Udostępnij na innych stronach

.NET jak widzę :].

On wywołuje akcje regularnie, ale zwróć uwagę na to, że timer pracuje jako osobny wątek w systemie i nawet jeśli wywołuje na czas metodę obsługi zdarzenia tick, to mija trochę czasu nim tekst zostanie dodany do listy.

Konkatenacja stringów wykonywana w mało efektywny sposób. Kiedy .NET łączy dwa stringi, nie robi tego dopisując jeden do drugiego, ale tworząc nowy string dla każdej pary. Lepszy efekt uzyskasz korzystając z klasy StringBuilder (ale tutaj jest stringów dość mało, więc nie powinien być to duży problem).

Poza tym kosztuje też obsługa samego mechanizmu zdarzeń.

Nie masz się czym przejmować, dziesięciomilisekundowe opóźnienie nie jest tutaj tragedią.

Kiedy potrzebujesz np. animować jakiś obiekt z prędkością 10px na sekundę nie polegaj na samym timerze. Licz odstęp czasu jaki minął od poprzedniego ticka i wykonuj przesunięcie w oparciu o tą wartość, posługując się podstawowymi wzorami z fizyki: s = t*v.

 

Najlepiej powiedz dokładniej co chcesz zrobić, bo możliwe, że taki niedokładny timer wystarczy i nie będzie trzeba nic więcej kombinować.

  • Like 1
Odnośnik do komentarza
Udostępnij na innych stronach

Nie chodzi o animacje, tylko o urzadzenie pomiarowe. Musi byc dokladne.

Doszlam do tych wnioskow: Timer dziala dobrze jesli interval jest rowny 1000, 500, 250 albo 125.

Jeszcze mi kolega podeslal cos takiego:

http://www.gssg.de/net_hiperftmr.htm

Kod zrodlowy do czegos co powinno mierzyc czas dokladniej, wyczytujac z kernela.

Teraz proboje to wbudowac w moj program.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności