Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Таймер на 1 мкс  (Прочитано 15326 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Кот
Гость
« : 27-06-2003 17:36 » 

Подскажите люди как сделать точный таймер под виндой
Записан
TimoN
Гость
« Ответ #1 : 27-06-2003 18:10 » 

Цитата: Кот
Подскажите люди как сделать точный таймер под виндой

TTimer. Ставь значуения в милисекундах (Interval) и всё.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 27-06-2003 18:48 » 

Судя по заголовку тебе нужен 1 мкс таймер. Маловато будет, боюсь ничего у тебя не выйдет, хотя для ф-ции в ядре- KeWaitForSingleObject, через которую работает WaitForSingleObject, интервалы задаются кратными 100 наносекундам, но в юзер мод выводятся только милисеккунды.

Народ- задавайте вопросы в темы, этот форум про С, а не про Windows, для Windows отдельная тема.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 27-06-2003 22:55 » 

Итак судя по теме все таки по С, а TTimer это из дельфи...
Отличие маленькое есть объект CTimer в MFC и есть просто SetTimer в API.

Делай событие и его обработчик (WM_TIMER) и выставляй значения - правда только в миллисекундах...
Еслди говорить о микросекундах - то это невозможно, да и представить себе задачу на таком уровне написанную не для кернеля - трудно...


Поясни как и что тебе надо.
Записан

А птичку нашу прошу не обижать!!!
grozny
Гость
« Ответ #4 : 28-06-2003 10:55 » 

если для 3-го кольца (обычное виндовое приложение) то читаем хэлп по API:

The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter.

Код:
BOOL QueryPerformanceCounter)
  LARGE_INTEGER *lpPerformanceCount   // counter value
:;

Parameters
lpPerformanceCount
[out] Pointer to a variable that receives the current performance-counter value, in counts.

The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.

Код:
BOOL QueryPerformanceFrequency)
  LARGE_INTEGER *lpFrequency   // current frequency
:;

Parameters
lpFrequency
[out] Pointer to a variable that receives the current performance-counter frequency, in counts per second. If the installed hardware does not support a high-resolution performance counter, this parameter can be zero.

Если заглянуть внутрь, то всё сводится к чтению процессорных тиков командой RDTSC (ix86). Т.е. если команда реализована в данном ЦПУ, то точные часы есть. На всех интеловских и АМДшных ЦПУ начиная с Пентиума она есть. Так что можно и самому написать при желании.

Ну а в ядре немного иначе - KeQuerySystemTime() возвращает количество 100 наносек. тиков с 1/01/1601. Тоже 64 битный счётчик.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 30-06-2003 13:32 » 

Цитата: grozny
если для 3-го кольца (обычное виндовое приложение) то читаем хэлп по API:

The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter.

Код:
BOOL QueryPerformanceCounter)
  LARGE_INTEGER *lpPerformanceCount   // counter value
:;

Parameters
lpPerformanceCount



Но это счетчик, а не таймер, если его поток перепланируют, то в 1 мкс не уложится.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #6 : 30-06-2003 13:36 » 

Смотрите мой пост в теме по COXTimer - видимо, это оно и есть! :!:
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 30-06-2003 14:33 » 

Цитата: baldr
Смотрите мой пост в теме по COXTimer - видимо, это оно и есть! :!:


А где этот пост, ссылку кинь.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #8 : 30-06-2003 14:36 » 

Короче, зайди в раздел COXTimer в форуме по С  - там практически про это...
А ссылка на сам компонент:
http://www.dundas.com/products/OnlineDocs/Toolbox/utility/COXTimer/overview.htm
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
grozny
Гость
« Ответ #9 : 30-06-2003 19:44 » 

да, похоже на QueryPerformanceCounter. Насчёт перепланировщика и точности - 1 мкс латентность в прерываниях и и пр. перехватах управления в виндах нигде не гарантируют, это не жёсткая ОСРВ, факт.

Однако когда спросишь время (а дадут тебе спросить время с точностью в десятки-худшее на нынешнем железе+ХР - сотня мкс) по QueryPerformanceCounter, оно само по себе будет точным до плюс-минус кванта железных часов  (около десятка нан, QueryPerformanceFrequency иногда даёт не саму частоту, а кратную). Конешно, голый RDTSC даст неправильный результат в некоторых случаях, ну вот потому и есть эти две ф-ции - QueryPerfromanceFrequency/QueryPerformanceCounter. Типа, даже на многопроцессорных машинах и в условиях Performance throttling на мобильных процах стабильный результат. В XP SP1 исправили, был глюк на Интеловских P3 SpeedStep
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #10 : 03-07-2003 05:47 » 

Цитата: Кот
Подскажите люди как сделать точный таймер под виндой

Используйте мультимедиатаймер, обычный вызывается не чаще ~0.055 сек
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #11 : 03-07-2003 06:54 » 

Вывод простой- никак тебе не сделать точный таймер с квантом 1мкс под Windows NT/2k/XP/2003.
Записан
grozny
Гость
« Ответ #12 : 03-07-2003 17:11 » 

Слава, что ты имеешь в виду под словом "точный"?

Точный таймер с квантом в ~100 нан есть (зависит от типа реал-тайм часов на мамке). См. выше. Он *точно* показывает время, когда его спросишь. А вот *спрашивать* это точное время раз в *точно* 1 мкс не получится - Винды не гарантируют точной отдачи управления вообще, но добиться стабильной латентности в 100 мкс можно (если повыкидывать ненужное и память туда-сюда не таскать, то можно лучше).
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #13 : 03-07-2003 17:16 » 

Написал бы как....
Записан

А птичку нашу прошу не обижать!!!
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #14 : 04-07-2003 05:08 » 

1. Тебе никто не гарантирует квант 100 нс. Просто пока так. Майкросовт в этих вопросах очень оторожна и по этому у них 2 функции QueryPerformanceCounter и QueryPerformanceFrequency.

2. Латенность в 100 мкс тоже получится только на отдельно взятой машине(небольшой группе машин). В общем и целом это время будет иметь довольно большой разброс.
Записан

Megabyte be with you!
Spectrum
Гость
« Ответ #15 : 27-11-2003 16:22 » 

Небльшой оффтоп:
_asm mov eax, rdtsc
(только для CPL = 0)
Reгистр RDTSC инкрементируется с каждым "тиком" CPU.
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #16 : 28-11-2003 14:01 » 

Вообще говоря, т.к. Wind... - не ОП реального времени, то, как говорили все присутствующие, гарантировать они могут только неожиданное зависание в самый ненужный момент Отлично
А максимально "быстрый" таймер - смотри раздел WIN API multimedia timers
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines