| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Таймер |
| Автор: Alexsar 6.2.2006, 00:20 |
| Задача заключается в том, что мне необходимо, скажем каждые 10 мсек., обрабатывать одну задачу, а каждые, например 7 мсек., другую. Пробовал создать 1 таймер и в нём осуществлять необходимые действия, в итоге получил расхождение по времени и чем дальше - тем хуже. Пробовал создать 2 таймера, ситуация несколько улучшилась, но всё же ошибки остались. Проблема в том, что никак не получается заставить таймер работать точно, как в досе Есть ли какие методы повысить точность? |
| Автор: Dreamer_0x01 6.2.2006, 00:51 |
| Если ты используешь таймер через функции SetTimer() и ловлю сообщения WM_TIMER, то ничего удивительного, у этого таймера на практике разрешающая способность как раз около 10-15 мс. Кроме того, эти сообщения не синхронные, и если приложение не выделяет ресурсов на отработку этих сообщений, они попросту игнорируются. Поэтому кроме неточности, ты также по истечение времени накапливаешь "пропуски" в отсчетах. Чтобы использовать более точныетаймеры, нужно использовать WaitForSingleObject() и подобные функции. |
| Автор: takedo 6.2.2006, 12:17 |
| Dreamer_0x01 WaitForSingleObject() - тоже ничего хорошего, вот уже обсуждалось: http://forum.vingrad.ru/index.php?showtopic=75593&hl=setwaitabletimer&st=15 Alexsar Я уже давно говорю: "А не надо испольдзовать просто виндовс для систем управления, виндовс - не система реального времени, используй RealTime Windows, то есть Windows CE". А если не CE, то никак... |
| Автор: OXOTHUK 6.2.2006, 12:42 |
| Вообще-то, существует такое понятие как "тик". Для винды это 10 мсек, т.е. какой бы период вы не ввели он всё равно будет кратен тику. Например: если введёшь 233 мсек, то реальный период будет 230 мсек, а если 237, то 240. |
| Автор: takedo 6.2.2006, 12:53 |
| OXOTHUK а где это написано? Вот я точно знаю, что в CE 5 заявляется 45 микросекунд. Но нигде не видел, что в простом виндовсе 10мс! Покажи, где это написано? Плиз. А то спать плохо |
| Автор: threef 6.2.2006, 18:09 | ||||
Вот класс из Феня Юаня, подсчитывающий тики процессора. Тики - величина достаточно постоянная во времени. Ты можешь проверить, какая периодичность твоих таймеров в тиках, и определить максимально достижимую точность во времени. ИМХО частота сработки микросхемы-таймера - 55 раз в секунду=> точность -18 мс, хотя эти сведения могли устареть. |
| Автор: Earnest 6.2.2006, 19:42 |
| Вроде бы на современных компьютерах стоят 100-герцовые таймеры. Это как раз и получается 10 мс... причем приблизительно... с учетом природы Windows. И это действительно нигде прямо не написано - по крайней мере там, где описываются соответствеющие функции (SetTimer, SetWaitableTimer и т.д.). Но зато в этом очень легко убедится на практике. Если ты не можешь объединить задачи (скажем, подменить выполнение 1 задачи раз в 7 мс на выполнение 10 задач в 70 мс), то - увы - это задача не для Виндовс! |
| Автор: Dreamer_0x01 6.2.2006, 20:52 |
| Нда, не ожидал такой подставы, как-то и не задумывался =) Я вообще контроллеры программирую, так там это для меня типовая задача - обеспечить стабильность измерний с точностью до микросеунд... ;) А тут такая фигня получается. Наводит на мысль разработать железяку на шину PCI и воткнуть ее туда, чтобы таймером служила |
| Автор: takedo 7.2.2006, 09:54 |
| Dreamer_0x01 А какая разница? Прерывание то все равно будет обрабатывать таже не реалтиме виндовс? => Только Windows CE! Кто то бы ещё хоть знал как она работает. ладно, если буду работать на этом же месте, то скоро перейду на CE. Но вероятность того, что закончу проект и закончу быть программистом больше |
| Автор: OXOTHUK 7.2.2006, 11:00 | ||||
В книжке В. В. Фаронова Delphi:
|
| Автор: takedo 7.2.2006, 11:08 |
| OXOTHUK Спасибо. |