Микроконтролери и електроника
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 ]
Заглавие: 

woody написа:
За прецизно време ползвай на пентиумите RDTSC.

Но не го ползвай в мобилни и многоядрени пентиуми. 8)

PS. За токова информация колкото си дал толкова можем да ти помогнем.
Ако разкажеш по на щироко какво искаш да направиш и как точно го правиш тогава ще можем и да ти помогнем по конкретно.

Автор:  woody [ Чет Юли 17, 2008 11:18 am ]
Заглавие: 

ike написа:
woody написа:
За прецизно време ползвай на пентиумите RDTSC.

Но не го ползвай в мобилни и многоядрени пентиуми. 8)


И си прав. :-)

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 ]
Заглавие: 

zaphod написа:
SetTimer прави точно това което искаш, но ако не ти стига точност гориш. разбира се може да ползваш нишка отделна + Sleep, там точността е май до милисекунда.


Батка, и двете имат точност до стотна.

Автор:  ps66 [ Пет Юли 18, 2008 10:27 am ]
Заглавие: 

Реконструктор написа:
zaphod написа:
SetTimer прави точно това което искаш, но ако не ти стига точност гориш. разбира се може да ползваш нишка отделна + Sleep, там точността е май до милисекунда.


Батка, и двете имат точност до стотна.


NtSetTimerResolution (ntdll.dll) - променя резолюцията на таймера ... според зависи (за мойта виста е 0.5ms) ..превкл. на нишки ...

в многозадачна система е много трудно постижим тайминг от 1ms ... винаги ще има нещо с по-голям приоритет ...

най-простото решение е нишка с THREAD_PRIORITY_TIME_CRITICAL и sleep(1) ... (за да не топлиш CPU-to)
но гаранция - нямаш !

Автор:  Реконструктор [ Пет Юли 18, 2008 11:45 am ]
Заглавие: 

ps66 написа:
NtSetTimerResolution (ntdll.dll) - променя резолюцията на таймера ... според зависи (за мойта виста е 0.5ms) ..превкл. на нишки ...


Честно казано, не бих рискувал да ползвам недокументирани вътрешни функции, при това такива, от които зависи функционирането на системата. :)

ps66 написа:
в многозадачна система е много трудно постижим тайминг от 1ms ... винаги ще има нещо с по-голям приоритет ...


Да. Времеви щампи могат да се вземат със супер голяма прецизност, напр. може да се прочете тук:
http://www.mvps.org/directx/articles/se ... ctions.htm
Но да се направи нещо циклично, което да работи с честота 1 КHz е доста трудно.

ps66 написа:
най-простото решение е нишка с THREAD_PRIORITY_TIME_CRITICAL и sleep(1) ... (за да не топлиш CPU-to)
но гаранция - нямаш !


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 написа:

Имах една идея - правиш няколко хиляди нишки и вътре Sleep(1) и QueryPerformanceCounter, като се опреснява глобален брояч. Нишката, на която се падне да прехвърли 1 ms. вика ф-ята която върши работата.


Ой... 8O Звучи много брутално :D Интересно като идея. Стреляйки с картечница, вместо с пистолет има доста по-голям шанс да улучиш десятката. Но пак няма гаранция колко близо до центъра ще попаднеш ;)

И все пак - леотрон - каква е целта на задачата?

Автор:  ps66 [ Пет Юли 18, 2008 12:56 pm ]
Заглавие: 

Реконструктор написа:
ps66 написа:
NtSetTimerResolution (ntdll.dll) - променя резолюцията на таймера ... според зависи (за мойта виста е 0.5ms) ..превкл. на нишки ...


Честно казано, не бих рискувал да ползвам недокументирани вътрешни функции, при това такива, от които зависи функционирането на системата. :)
....


съвсем "документирано" си е : 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/