| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Timer със C++ builder 6 http://mcu-bg.com/mcu_site/viewtopic.php?f=16&t=5944 |
Страница 1 от 2 |
| Автор: | leotron [ Пон Юли 14, 2008 8:19 pm ] |
| Заглавие: | Timer със C++ builder 6 |
Търся начин да реализирам таймер. Сещам се за 3 начина в момента. Първият е sleep(), но не ми харесва защото не мога да правя нищо друго освен да чакам. Другият е да използвам timer от C Buildera, но и тук положението е същото. Третият, най оптимален за мен (поне за сега), е да сравнявам изминало време от часовника на компа. Та въпросът ми е има ли някакъв начин за инициализация и стартиране на таймер и когато изтече да влиза в някакъв хендлер ? Използвам C++ Builder 6. |
|
| Автор: | Реконструктор [ Пон Юли 14, 2008 9:01 pm ] |
| Заглавие: | |
Каква точност ти трябва? |
|
| Автор: | leotron [ Вто Юли 15, 2008 12:06 am ] | |||||||||
| Заглавие: | ||||||||||
Ами до милисекунди да речем. |
||||||||||
| Автор: | Реконструктор [ Вто Юли 15, 2008 9:52 am ] |
| Заглавие: | |
Еми без нишки май няма да стане. |
|
| Автор: | syscop [ Вто Юли 15, 2008 3:19 pm ] |
| Заглавие: | |
MSDN, функцията SetTimer, ако ти трябва по-малко време може да погледнеш какво пише за QueryPerformanceCounter |
|
| Автор: | Реконструктор [ Вто Юли 15, 2008 4:36 pm ] |
| Заглавие: | |
SetTimer работи максимум със стотни, Sleep също. |
|
| Автор: | woody [ Сря Юли 16, 2008 8:07 pm ] |
| Заглавие: | |
За прецизно време ползвай на пентиумите RDTSC. |
|
| Автор: | ike [ Чет Юли 17, 2008 12:30 am ] | |||||||||
| Заглавие: | ||||||||||
Но не го ползвай в мобилни и многоядрени пентиуми. PS. За токова информация колкото си дал толкова можем да ти помогнем. Ако разкажеш по на щироко какво искаш да направиш и как точно го правиш тогава ще можем и да ти помогнем по конкретно. |
||||||||||
| Автор: | woody [ Чет Юли 17, 2008 11:18 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
И си прав. http://en.wikipedia.org/wiki/RDTSC Under Windows platforms, Microsoft strongly discourages using RDTSC for high-resolution timing for exactly these reasons, providing instead the Windows APIs QueryPerformanceCounter and QueryPerformanceFrequency. http://en.wikipedia.org/wiki/High_Precision_Event_Timer |
|||||||||||||||||||
| Автор: | zaphod [ Пет Юли 18, 2008 8:40 am ] |
| Заглавие: | |
SetTimer прави точно това което искаш, но ако не ти стига точност гориш. разбира се може да ползваш нишка отделна + Sleep, там точността е май до милисекунда. |
|
| Автор: | Реконструктор [ Пет Юли 18, 2008 9:08 am ] | |||||||||
| Заглавие: | ||||||||||
Батка, и двете имат точност до стотна. |
||||||||||
| Автор: | ps66 [ Пет Юли 18, 2008 10:27 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
NtSetTimerResolution (ntdll.dll) - променя резолюцията на таймера ... според зависи (за мойта виста е 0.5ms) ..превкл. на нишки ... в многозадачна система е много трудно постижим тайминг от 1ms ... винаги ще има нещо с по-голям приоритет ... най-простото решение е нишка с THREAD_PRIORITY_TIME_CRITICAL и sleep(1) ... (за да не топлиш CPU-to) но гаранция - нямаш ! |
|||||||||||||||||||
| Автор: | Реконструктор [ Пет Юли 18, 2008 11:45 am ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
Честно казано, не бих рискувал да ползвам недокументирани вътрешни функции, при това такива, от които зависи функционирането на системата.
Да. Времеви щампи могат да се вземат със супер голяма прецизност, напр. може да се прочете тук: http://www.mvps.org/directx/articles/se ... ctions.htm Но да се направи нещо циклично, което да работи с честота 1 КHz е доста трудно.
Sleep(1) почти никога не значи това. Най-често значи Sleep(10), ако си спрял всички сървиси и нямаш почти нищо работещо може да стане и Sleep(няколко ms). Пробвал съм го на практика. Най-лесният начин е, както казваш, THREAD_PRIORITY_TIME_CRITICAL, но вътре няма Sleep, а в цикъла викаш QueryPerformanceCounter непрекъснато. Задръства се цялата система с твойте глупости, ама ако е embedded/dedicated не ти пука. Имах една идея - правиш няколко хиляди нишки и вътре Sleep(1) и QueryPerformanceCounter, като се опреснява глобален брояч. Нишката, на която се падне да прехвърли 1 ms. вика ф-ята която върши работата. |
||||||||||||||||||||||||||||
| Автор: | setoy [ Пет Юли 18, 2008 12:00 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Ой... И все пак - леотрон - каква е целта на задачата? |
|||||||||||||||||||
| Автор: | ps66 [ Пет Юли 18, 2008 12:56 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
съвсем "документирано" си е : http://technet.microsoft.com/en-us/sysinternals/bb897569.aspx a Sleep(1) - ти осигурява най-малкото закъснение възможно в момента което зависи от приоритета на нишката, приоритена на приложението, ... и всичко останало ... без да заема 100% ресурсите на CPU и на-важното .. със сигурност зависи от NtSetTimerResolution! |
|||||||||||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|