QueryPerformanceCounter

0

Witam!
Chcialbym napisac program w Delphi z uzyciem QueryPerformanceCounter (pod Win XP), ktory wykonuje np. klikniecie dokladnie co 2 ms, ale interesuje mnie jedna rzecz:
Zalozmy, ze zlicze czas z superdokladnoscia, ale czy Windows mi 'pozwoli' zrobic to co chce w takim czasie jak ja chce??
Wiem ze timery win XP moga pracowac z minimalnym czasem 10ms..
Czy trzeba moze tworzyc osobny watek, albo cos jeszcze innego??
Chyba, ze zle mysle i ta fukncja QueryPerformanceCounter bedize miec bardzo wysoki priorytet i bedzie wymuszac to klikniecie chociaz co rowne 10 czy 20ms??

// popraw temat! - Ł

0

Nawet, jeśli co 2ms będziesz wykonywał kliknięcie, pytaniem jest: po ilu milisekundach pętla komunikatów je obsłuży - na to nie masz wpływu, a im bardziej obciążysz system swoim procesem, tym kliknięcie będzie obsłużone później.

Pamiętaj, że Windows to nie jest system operacyjnym czasu rzeczywistego.

0

Przez chwile mialem nadzieje, ze dzieki tej cudownej, superdkokladnej funkcji cos nie bedzie w koncu zalezec od Windows ;-)
Chwila zludzenia..

A czy QueryPerformanceCounter jest w stanie wymusic chociaz na Windows wykonywanie dokladnie w jakims czasie (np.100 ms) mojego zadania, czy rowniez moze sie zdazyc sytuacja, ze jakis watek,czy zadanie o wyzszym priorytecie wyrzuci z kolejki moje 'klikanie' i tym samym pojawi sie opoznienie??

A moze ustawienie najwyzszego priotytetu dla mojego procesu moze zalatwic sprawe..

0
wwwodz napisał(a)

A czy QueryPerformanceCounter jest w stanie wymusic na Windows wykonywanie dokladnie w jakims czasie (np.100 ms) mojego zadania, czy rowniez moze sie zdazyc sytuacja, ze jakis watek,czy zadanie o wyzszym priorytecie wyrzuci z kolejki moje 'klikanie' i tym samym pojawi sie opoznienie??

A moze ustawienie najwyzszego priotytetu dla mojego procesu moze zalatwic sprawe..

QueryPerformanceCounter podaje tylko wskazanie jakiegoś zegara,
(jego częstotliwość podaje QueryPerformanceFrequency - zazwyczaj z 1000 razy mniej niż procesora).

Wykonywanie jakiejś czynności z częst. 1kH (czyli co 1ms) jest raczej mało praktyczne,
ale jeśli już to wystarczy GetTickCount (lub timeGetTime) - w XP podaje wartość z dokład. = 1ms

t := GetTickCount;
while GetTickCount = t do ; // czekamy na zmianę - max 1 ms lub tyle ile wynosi rozdzielczość tick

start := GetTickCount;        
while GetTickCount = start do ; // 
endt := GetTickCount;
// dt = endt - start; // = 1ms, 

jeśli dt ma więcej, to inny proces zabrał czas lub/i ms kłamie...
ten pierwszy przypadek można ograniczyć: SetPriorityClass + SetThreadPriority,
ale to ma raczej małe znaczenie i raczej nie jest bezpieczne.

0

Po pierwsze QueryPerformanceCounter niczego nie jest w stanie wymusić. To jest zwykła funkcja która odczytuje czas zliczany przez dokładny zegar (w dodatku sprzętowy). Funkcja ta nie działa tak jak timery które po danym odcinku czasu wysyłają na przykład wiadomość do okna. Ona tylko odczytuje zwartośc pewnych rejestrów wy/we i tyle. A to czy twój program bedzie odnierzał dokładne odcinki czasu czy nie zależy tylko od tego jak wiele procesów aktualnie będzie uruchomionych no i oczywiście jakie priorytety dane procesy będą miały.
Możesz za pomocą wątku w wiecznej pętli cały czas wykonywać QueryPerformanceCounter i sprawdzać czy mineły już 2ms, ale i tak o tym kiedy twój watek otrzyma czas procesora na wykonanie tej funkcji decyduje Windows i tyle. Zresztą samo wykonanie QueryPerformanceCounter jest dosyć długim procesem jak na odczyt z pewnego adresu, a to dlatego, że wykonywane są w niej instrukcje uprzywilejowane co wymaga przejścia procesora na poziom uprzywilejowany.
Jeśli chciał byś odmierzać naprawdę dokładne odcinki czasu to twoja aplikacja powinna dzialać cały czas na poziomi uprzywilejowanym tak jak obiekty jądra (w czasie rzeczywistym), i dostawać czas procesora po na przkład po wystapieniu jakiegoś przerwania sprzętowego.

0

ad mczarny: windows nie jest systemem czasu rzeczywistego.
ad wwwodz: ani na windows, ani nawet na linuksie czy fbsd nie wykonasz operacji co dokładny odcinek czasu, bo nie są to systemu czasu rzeczywistego. gwarantują one jedynie pewien średni czas wykonania operacji.

0

wwwodz'u -> powiedz do czego tego potrzebujesz, może wymyśli się inny sposób. Jak do sterowania czymś, to może jakiś mikrokomputer (na przykład z rodziny 8051) podpiąć pod port powiedzmy szeregowy - tym możesz dokładnie odmierzyć czas.

0

ad ŁF: będe bardzo wdzięczny jesli wytłumaczysz mi różnice pomiędzy "czasem rzeczywistym" a "łagodnie rzeczywistym" i nie chodzi mi tutaj o różnicę pomiędzy "systemem czasu rzeczywistego" i "systemem czasu łagonie rzeczywistego" bo tą znam ;).

Z góry dzięki za odpowiedz.

// skrót myślowy - Ł

0

Nie czepiajmy się pojednyczych słów, bo odejdziemy od tematu.

0

Mysle o programiku, ktory po prostu klikalby w rownych odstepach czasu w okreslony punkt :-)
Podstawowym warunkiem sa wlasnie rowne odstepy czasu miedzy kliknieciami.

Na poczatku wydawalo sie to bezproblemowe do zrobienia, ale w miare zaglebiania sie w problemy czasowe i Timerowe, ktore pozwolilyby mi odmierzac ten czas bardzo dokladnie zapomnialem o tym ze Windows ma tutaj decydujace slowo..
A moze jakies 'mechaniczne' czy 'elektryczne' klikanie myszka, jakims generatorem podpietym do portu zamiast myszki..
Ale wlasciwie najlepiej gdyby to bylo rozwiazane programowe..

0

Takie sprzętowe - czyli klikanie zamiast myszy i tak dodaje polecenia do systemowej kolejki, i może zostać obsłużone z opóźnieniem. Zastanów się czy taka dokładność czasu jest naprawdę Ci potrzeba.

0

Podstawowe zagadnienie to dla mnie rowne odstepy czasu miedzy jedna akcja a druga, albo znalezienie rozwiazania do w miare rownomiernego dzialania..

A co z MMTimer'em on podobno ma wysokie priorytety dzialania, moze bylby dobry w samym 'dyktowaniu' tempa dzialania programiku, czy moze rozwiazanie predatorvsśruby byloby lepsze..

1 użytkowników online, w tym zalogowanych: 0, gości: 1