Ania Napisano 30 Październik 2008 Napisano 30 Październik 2008 (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) Co jest przyczyna, i jak mozna zrobic zeby on wywolywal akcje regularnie? (efektem koncowym ma byc wyczytywanie i analizowanie videostreamu co 100 ms) Edytowane 30 Październik 2008 przez Ania
3Jane Napisano 30 Październik 2008 Napisano 30 Październik 2008 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. 1
Ex3 Napisano 30 Październik 2008 Napisano 30 Październik 2008 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
3Jane Napisano 30 Październik 2008 Napisano 30 Październik 2008 Ex3, i co, potem to leci w petli? Nie zarzyna to procka?
Ania Napisano 30 Październik 2008 Autor Napisano 30 Październik 2008 (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 30 Październik 2008 przez Ania
Ex3 Napisano 30 Październik 2008 Napisano 30 Październik 2008 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 ;)
Ania Napisano 30 Październik 2008 Autor Napisano 30 Październik 2008 Problem jest, że to jest poniżej jednej sekundy. Z całymi sekundami zdaje się działać.
Bacry Napisano 31 Październik 2008 Napisano 31 Październik 2008 może to głupie ale czy próbowałaś użyć kontrolki timera. Dawno nic nie robiłem w visualu :)
Ania Napisano 31 Październik 2008 Autor Napisano 31 Październik 2008 Właśnie to w pierwszym poście jest z timerem.
mathix Napisano 31 Październik 2008 Napisano 31 Październik 2008 .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ć. 1
Ania Napisano 31 Październik 2008 Autor Napisano 31 Październik 2008 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.
Rekomendowane odpowiedzi
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ę