Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как срабатывает SetTimer? Не соблюдается время 
:(
    Опции темы
Adry
Дата 20.5.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Рисую проект в MFC (Честно говоря, первый мой проект на VS c++ вообще в жизни. Во всем приходится разбираться по ходу)

Суть вопроса вот в чем. 
У меня в программе используются два таймера, которые отрабатываются функцией SetTimer. Первый таймер (на 1 секунду) работает вроде как нормально (по личным ощущениям, с точностью до милисекунд не проверяла), а вот второй я поставила на 10 милисекунд.

Простите, что код привожу в таком виде: проект пишу на работе, дома даже VS не стоит.

Код примерно такой

Код

#define ID_TIMER_1 100
#define ID_TIMER_2 200

... 

int TimeCount=0;


В OnInitDialog()
{
..................
SetTimer(ID_TIMER_1,1000,NULL);
SetTimer(ID_TIMER_2,10,NULL);

}

В OnTimer()
{
    TimeCount++;

   unsigned long time1=( unsigned long)timeGetTime();
  
   fprintf(file, "%d %ul\n",TimeCount, time1);

}



В результате в файле видим следующее

0 183000
1 183015
2 183031
3 183046

и так далее. (То есть не через 10, а через 15 или 16 милисекунд)

Если ставлю таймер на 20 милисекунд - то же самое : срабатывание  через 31-32 милисекунды. То есть заданный интервал*1.5

Что бы это могло значить и можно ли как-то это побороть? 


Это сообщение отредактировал(а) Adry - 22.5.2011, 09:34
PM MAIL   Вверх
volatile
Дата 20.5.2011, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 4
Всего: 85



У обычного таймера очень грубая дискретность.

PM MAIL   Вверх
borisbn
Дата 21.5.2011, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 2
Всего: 135



Цитата(Adry @  20.5.2011,  21:24 Найти цитируемый пост)
Что бы это могло значить и можно ли как-то это побороть? 

В Windows дискретность таймера начинает совпадать с заданной от 55 мс. При чём иногда могут получаться  выбросы +-10...15 мс.
Если нужна высокая точность на малых интервалах - гугли мультимедийный таймер или таймеры DirectX.

А лучше опиши задачу. М.б. такая точность и не нужна вообще ?

Это сообщение отредактировал(а) borisbn - 21.5.2011, 00:05


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Adry
Дата 21.5.2011, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



borisbn,  спасибо за ответ! Все встало на свои места.

В принципе, мне 15-16 мс хватает. 
Пишу программу для управления одной железкой с ПК. Замеряли осциллографом: характерное время, за которое железка обрабатывает запрос и формирует ответ - это 8мс. (Плюс что-то еще на то, чтобы мне считать этот ответ по USB.) Так что 15 мс, в принципе, устраивает...smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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