Napisano 30 Październik 200816 l Mam taki problem z timerem w visual basic, ma tykac co 100 ms, ale tyka nieregularnie. Cytat 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 200816 l przez Ania
Napisano 30 Październik 200816 l 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.
Napisano 30 Październik 200816 l 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 30 Październik 200816 l Autor 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 200816 l przez Ania
Napisano 30 Październik 200816 l 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 30 Październik 200816 l Autor Problem jest, że to jest poniżej jednej sekundy. Z całymi sekundami zdaje się działać.
Napisano 31 Październik 200816 l może to głupie ale czy próbowałaś użyć kontrolki timera. Dawno nic nie robiłem w visualu :)
Napisano 31 Październik 200816 l .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ć.
Napisano 31 Październik 200816 l Autor 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