Skocz do zawartości

Visual Basic - timer tyka nieregularnie


Rekomendowane odpowiedzi

Napisano (edytowane)

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
  • Odpowiedzi 10
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

Napisano

Ja też z Vb mam nie wiele wspólnego ale we Flashu jest to samo :) i tak sobie z tym poradziłem:

 

sekundy = Math.round(getTimer()/1000);

 

GetTimer - funkcja która pobiera dokładny czas od uruchomienia programu

Napisano (edytowane)

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
Napisano

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 ;)

Napisano

.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
Napisano

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.

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