Ania Posted October 30, 2008 Share Posted October 30, 2008 (edited) 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) Edited October 30, 2008 by Ania Link to comment Share on other sites More sharing options...
3Jane Posted October 30, 2008 Share Posted October 30, 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 Link to comment Share on other sites More sharing options...
Ex3 Posted October 30, 2008 Share Posted October 30, 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 Link to comment Share on other sites More sharing options...
3Jane Posted October 30, 2008 Share Posted October 30, 2008 Ex3, i co, potem to leci w petli? Nie zarzyna to procka? Link to comment Share on other sites More sharing options...
Ania Posted October 30, 2008 Author Share Posted October 30, 2008 (edited) 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. Edited October 30, 2008 by Ania Link to comment Share on other sites More sharing options...
Ex3 Posted October 30, 2008 Share Posted October 30, 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 ;) Link to comment Share on other sites More sharing options...
Ania Posted October 30, 2008 Author Share Posted October 30, 2008 Problem jest, że to jest poniżej jednej sekundy. Z całymi sekundami zdaje się działać. Link to comment Share on other sites More sharing options...
Bacry Posted October 31, 2008 Share Posted October 31, 2008 może to głupie ale czy próbowałaś użyć kontrolki timera. Dawno nic nie robiłem w visualu :) Link to comment Share on other sites More sharing options...
Ania Posted October 31, 2008 Author Share Posted October 31, 2008 Właśnie to w pierwszym poście jest z timerem. Link to comment Share on other sites More sharing options...
mathix Posted October 31, 2008 Share Posted October 31, 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 Link to comment Share on other sites More sharing options...
Ania Posted October 31, 2008 Author Share Posted October 31, 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. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now