Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таймер, как сделать чтоб таймер работал точнее 
:(
    Опции темы
Alexsar
  Дата 6.2.2006, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



Задача заключается в том, что мне необходимо, скажем каждые 10 мсек., обрабатывать одну задачу, а каждые, например 7 мсек., другую. Пробовал создать 1 таймер и в нём осуществлять необходимые действия, в итоге получил расхождение по времени и чем дальше - тем хуже. Пробовал создать 2 таймера, ситуация несколько улучшилась, но всё же ошибки остались.
Проблема в том, что никак не получается заставить таймер работать точно, как в досе
Есть ли какие методы повысить точность?
PM MAIL   Вверх
Dreamer_0x01
Дата 6.2.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Если ты используешь таймер через функции SetTimer() и ловлю сообщения WM_TIMER, то ничего удивительного, у этого таймера на практике разрешающая способность как раз около 10-15 мс. Кроме того, эти сообщения не синхронные, и если приложение не выделяет ресурсов на отработку этих сообщений, они попросту игнорируются. Поэтому кроме неточности, ты также по истечение времени накапливаешь "пропуски" в отсчетах.

Чтобы использовать более точныетаймеры, нужно использовать WaitForSingleObject() и подобные функции.



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
takedo
Дата 6.2.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Dreamer_0x01 WaitForSingleObject() - тоже ничего хорошего, вот уже обсуждалось:
http://forum.vingrad.ru/index.php?showtopi...timer&st=15
Alexsar Я уже давно говорю: "А не надо испольдзовать просто виндовс для систем управления, виндовс - не система реального времени, используй RealTime Windows, то есть Windows CE". А если не CE, то никак... smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
OXOTHUK
Дата 6.2.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Вообще-то, существует такое понятие как "тик". Для винды это 10 мсек, т.е. какой бы период вы не ввели он всё равно будет кратен тику. Например: если введёшь 233 мсек, то реальный период будет 230 мсек, а если 237, то 240.
PM MAIL   Вверх
takedo
Дата 6.2.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



OXOTHUK а где это написано? Вот я точно знаю, что в CE 5 заявляется 45 микросекунд. Но нигде не видел, что в простом виндовсе 10мс! Покажи, где это написано? Плиз. А то спать плохо smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
threef
Дата 6.2.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 1
Всего: 10



Цитата

Код

#pragma once
typedef unsigned __int64 bigint;
// возвращает число тактов с момента включения компа
inline bigint Takts(void)
{
    _asm _emit 0x0F
    _asm _emit 0x31
}
class Taktimer{
    bigint start;
public:
    bigint over;//время на обработку самого таймера
    Taktimer()
    {
        over=0;
        Start();
        over=Stop();
    }
    void Start(void) 
    {
        start=Takts();
    }
    bigint Stop(void) // сколько тиков прошло
    {
        return Takts()-start-over;
    }
};



Вот класс из Феня Юаня, подсчитывающий тики процессора. Тики - величина достаточно постоянная во времени. Ты можешь проверить, какая периодичность твоих таймеров в тиках, и определить максимально достижимую точность во времени. ИМХО частота сработки микросхемы-таймера - 55 раз в секунду=> точность -18 мс, хотя эти сведения могли устареть.
PM MAIL   Вверх
Earnest
Дата 6.2.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Вроде бы на современных компьютерах стоят 100-герцовые таймеры. Это как раз и получается 10 мс... причем приблизительно... с учетом природы Windows. И это действительно нигде прямо не написано - по крайней мере там, где описываются соответствеющие функции (SetTimer, SetWaitableTimer и т.д.). Но зато в этом очень легко убедится на практике.
Если ты не можешь объединить задачи (скажем, подменить выполнение 1 задачи раз в 7 мс на выполнение 10 задач в 70 мс), то - увы - это задача не для Виндовс!


--------------------
...
PM   Вверх
Dreamer_0x01
Дата 6.2.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Нда, не ожидал такой подставы, как-то и не задумывался =)

Я вообще контроллеры программирую, так там это для меня типовая задача - обеспечить стабильность измерний с точностью до микросеунд... ;)
А тут такая фигня получается.

Наводит на мысль разработать железяку на шину PCI и воткнуть ее туда, чтобы таймером служила smile


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
takedo
Дата 7.2.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Dreamer_0x01 А какая разница? Прерывание то все равно будет обрабатывать таже не реалтиме виндовс? => Только Windows CE! Кто то бы ещё хоть знал как она работает. ладно, если буду работать на этом же месте, то скоро перейду на CE. Но вероятность того, что закончу проект и закончу быть программистом больше smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
OXOTHUK
Дата 7.2.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Цитата

Покажи, где это написано? Плиз. А то спать плохо

В книжке В. В. Фаронова Delphi:
Цитата

... Следует учесть, что в силу специфики реализации стандартного аппаратного таймера  IBM-совместимого компьютера минимальный реально достижимый интервал отсчёта времени в операционных системах MS-DOS, Windows 3.x и Windows 95/98/ME не может быть меньше 55 миллисекунд (этот интервал называется тиком). Более того, любой интервал времени, отсчитываемый с помощью таймера, в этих операционных системах всегда кратен 55 миллисекундам. Замечу, что для операционных систем Windows NT Server (Workstation), Windows 2000, Windows XP длительность тика составляет 10 мс. ...

PM MAIL   Вверх
takedo
Дата 7.2.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



OXOTHUK Спасибо.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1103 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.