| Автор |
Съобщение |
|
leotron
Ранг: Минаващ
Регистриран на: Пон Ное 28, 2005 10:49 am Мнения: 86 Местоположение: Русе
|
 Timer със C++ builder 6
Търся начин да реализирам таймер. Сещам се за 3 начина в момента. Първият е sleep(), но не ми харесва защото не мога да правя нищо друго освен да чакам. Другият е да използвам timer от C Buildera, но и тук положението е същото. Третият, най оптимален за мен (поне за сега), е да сравнявам изминало време от часовника на компа. Та въпросът ми е има ли някакъв начин за инициализация и стартиране на таймер и когато изтече да влиза в някакъв хендлер ? Използвам C++ Builder 6.
|
| Пон Юли 14, 2008 8:19 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Каква точност ти трябва?
|
| Пон Юли 14, 2008 9:01 pm |
|
 |
|
leotron
Ранг: Минаващ
Регистриран на: Пон Ное 28, 2005 10:49 am Мнения: 86 Местоположение: Русе
|
Ами до милисекунди да речем.
|
| Вто Юли 15, 2008 12:06 am |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Еми без нишки май няма да стане. 
|
| Вто Юли 15, 2008 9:52 am |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2277
|
MSDN, функцията SetTimer, ако ти трябва по-малко време може да погледнеш какво пише за QueryPerformanceCounter 
|
| Вто Юли 15, 2008 3:19 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
SetTimer работи максимум със стотни, Sleep също. 
|
| Вто Юли 15, 2008 4:36 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
За прецизно време ползвай на пентиумите RDTSC.
|
| Сря Юли 16, 2008 8:07 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
Но не го ползвай в мобилни и многоядрени пентиуми.
PS. За токова информация колкото си дал толкова можем да ти помогнем.
Ако разкажеш по на щироко какво искаш да направиш и как точно го правиш тогава ще можем и да ти помогнем по конкретно.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Чет Юли 17, 2008 12:30 am |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
И си прав.
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
|
| Чет Юли 17, 2008 11:18 am |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
SetTimer прави точно това което искаш, но ако не ти стига точност гориш. разбира се може да ползваш нишка отделна + Sleep, там точността е май до милисекунда.
|
| Пет Юли 18, 2008 8:40 am |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Батка, и двете имат точност до стотна.
|
| Пет Юли 18, 2008 9:08 am |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
NtSetTimerResolution (ntdll.dll) - променя резолюцията на таймера ... според зависи (за мойта виста е 0.5ms) ..превкл. на нишки ...
в многозадачна система е много трудно постижим тайминг от 1ms ... винаги ще има нещо с по-голям приоритет ...
най-простото решение е нишка с THREAD_PRIORITY_TIME_CRITICAL и sleep(1) ... (за да не топлиш CPU-to)
но гаранция - нямаш !
_________________ путинофили: "иди н***й"
|
| Пет Юли 18, 2008 10:27 am |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Честно казано, не бих рискувал да ползвам недокументирани вътрешни функции, при това такива, от които зависи функционирането на системата.  Да. Времеви щампи могат да се вземат със супер голяма прецизност, напр. може да се прочете тук: 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. вика ф-ята която върши работата.
|
| Пет Юли 18, 2008 11:45 am |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Ой...  Звучи много брутално  Интересно като идея. Стреляйки с картечница, вместо с пистолет има доста по-голям шанс да улучиш десятката. Но пак няма гаранция колко близо до центъра ще попаднеш
И все пак - леотрон - каква е целта на задачата?
|
| Пет Юли 18, 2008 12:00 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
съвсем "документирано" си е : http://technet.microsoft.com/en-us/sysinternals/bb897569.aspx
a Sleep(1) - ти осигурява най-малкото закъснение възможно в момента което зависи от приоритета на нишката, приоритена на приложението, ... и всичко останало ... без да заема 100% ресурсите на CPU
и на-важното .. със сигурност зависи от NtSetTimerResolution!
_________________ путинофили: "иди н***й"
|
| Пет Юли 18, 2008 12:56 pm |
|
|