Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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, то никак... smile

Автор: OXOTHUK 6.2.2006, 12:42
Вообще-то, существует такое понятие как "тик". Для винды это 10 мсек, т.е. какой бы период вы не ввели он всё равно будет кратен тику. Например: если введёшь 233 мсек, то реальный период будет 230 мсек, а если 237, то 240.

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

Автор: threef 6.2.2006, 18:09
Цитата

Код

#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 мс, хотя эти сведения могли устареть.

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

Автор: Dreamer_0x01 6.2.2006, 20:52
Нда, не ожидал такой подставы, как-то и не задумывался =)

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

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

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

Автор: OXOTHUK 7.2.2006, 11:00
Цитата

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

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

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

Автор: takedo 7.2.2006, 11:08
OXOTHUK Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)