![]() |
|
![]() ![]() ![]() |
|
Alexsar |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 6.5.2005 Репутация: нет Всего: 1 |
Задача заключается в том, что мне необходимо, скажем каждые 10 мсек., обрабатывать одну задачу, а каждые, например 7 мсек., другую. Пробовал создать 1 таймер и в нём осуществлять необходимые действия, в итоге получил расхождение по времени и чем дальше - тем хуже. Пробовал создать 2 таймера, ситуация несколько улучшилась, но всё же ошибки остались.
Проблема в том, что никак не получается заставить таймер работать точно, как в досе Есть ли какие методы повысить точность? |
|||
|
||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Если ты используешь таймер через функции SetTimer() и ловлю сообщения WM_TIMER, то ничего удивительного, у этого таймера на практике разрешающая способность как раз около 10-15 мс. Кроме того, эти сообщения не синхронные, и если приложение не выделяет ресурсов на отработку этих сообщений, они попросту игнорируются. Поэтому кроме неточности, ты также по истечение времени накапливаешь "пропуски" в отсчетах.
Чтобы использовать более точныетаймеры, нужно использовать WaitForSingleObject() и подобные функции. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
takedo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Dreamer_0x01 WaitForSingleObject() - тоже ничего хорошего, вот уже обсуждалось:
http://forum.vingrad.ru/index.php?showtopi...timer&st=15 Alexsar Я уже давно говорю: "А не надо испольдзовать просто виндовс для систем управления, виндовс - не система реального времени, используй RealTime Windows, то есть Windows CE". А если не CE, то никак... ![]() -------------------- я не гольфист - я хоккеист |
|||
|
||||
OXOTHUK |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.9.2005 Репутация: нет Всего: 6 |
Вообще-то, существует такое понятие как "тик". Для винды это 10 мсек, т.е. какой бы период вы не ввели он всё равно будет кратен тику. Например: если введёшь 233 мсек, то реальный период будет 230 мсек, а если 237, то 240.
|
|||
|
||||
takedo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
OXOTHUK а где это написано? Вот я точно знаю, что в CE 5 заявляется 45 микросекунд. Но нигде не видел, что в простом виндовсе 10мс! Покажи, где это написано? Плиз. А то спать плохо
![]() -------------------- я не гольфист - я хоккеист |
|||
|
||||
threef |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 1 Всего: 10 |
Вот класс из Феня Юаня, подсчитывающий тики процессора. Тики - величина достаточно постоянная во времени. Ты можешь проверить, какая периодичность твоих таймеров в тиках, и определить максимально достижимую точность во времени. ИМХО частота сработки микросхемы-таймера - 55 раз в секунду=> точность -18 мс, хотя эти сведения могли устареть. |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Вроде бы на современных компьютерах стоят 100-герцовые таймеры. Это как раз и получается 10 мс... причем приблизительно... с учетом природы Windows. И это действительно нигде прямо не написано - по крайней мере там, где описываются соответствеющие функции (SetTimer, SetWaitableTimer и т.д.). Но зато в этом очень легко убедится на практике.
Если ты не можешь объединить задачи (скажем, подменить выполнение 1 задачи раз в 7 мс на выполнение 10 задач в 70 мс), то - увы - это задача не для Виндовс! -------------------- ... |
|||
|
||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Нда, не ожидал такой подставы, как-то и не задумывался =)
Я вообще контроллеры программирую, так там это для меня типовая задача - обеспечить стабильность измерний с точностью до микросеунд... ;) А тут такая фигня получается. Наводит на мысль разработать железяку на шину PCI и воткнуть ее туда, чтобы таймером служила ![]() -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
takedo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Dreamer_0x01 А какая разница? Прерывание то все равно будет обрабатывать таже не реалтиме виндовс? => Только Windows CE! Кто то бы ещё хоть знал как она работает. ладно, если буду работать на этом же месте, то скоро перейду на CE. Но вероятность того, что закончу проект и закончу быть программистом больше
![]() -------------------- я не гольфист - я хоккеист |
|||
|
||||
OXOTHUK |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.9.2005 Репутация: нет Всего: 6 |
В книжке В. В. Фаронова Delphi:
|
||||
|
|||||
takedo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
OXOTHUK Спасибо.
-------------------- я не гольфист - я хоккеист |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |