Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование функции GetTickCount для создания задержки в 8 мсе [D7, Win2k, WinXP]


Игорь Степанов ©   (2006-01-24 20:18:00) 

Уважаемые мастера,

Я использую функцию API GetTickCount для задержки длительностью 8 мсек в следующем коде:

Var Time1,time2:Dword;

Time1:=GetTickCount;
repeat
  Time2:=GetTickCount;
until (time2-time1)>=8;

Однако цикл срабатываетпри разности в 15 или 16 вместо 8 тиков.

В чём тут дело?

С уважением,

Игорь Степанов


Игорь Степанов   (2006-01-26 21:36:00) [1]

Уважаемые мастера,

Действительно, функция GetTickCount более или менее точно работает после 1000 тиков. Она вообще не даёт меньше 15-16 мс при коротких интервалах. Я попробовал функции QueryPerformanceFrequency(res) в паре с QueryPerformanceCounter(t1 или t2), где RES,T1,T2:TLargeInteger (объявлен в модуле Windows.pas). Если справедлива информация в Win32.hlp, то QueryPerformanceFrequency даёт количество отсчётов в секунду. При этом условии формула 1000*(t2-t1)/res даёт разницу в миллисекундах между моментами t1 и t2 применения функции QueryPerformanceCounter. Один оборот стрелки за 120 шагов происходит в среднем за 1001,5 мсек, что вполне приемлемо. Однако прорисовывание стрелки 240 раз добавляет в среднем 17 мсек. Тем не менее, можно рассчитать поправочный коэффциент и обеспечить приемлемую точность. Таким образом, для моих целей этот подход вполне подходит.

Благодарю за участие в дискуссии.

С уважением,
Игорь Степанов


Digitman   (2006-01-25 17:22:00) [2]


>  шагом 8.33 миллисекунды


откуда взялась сияцифирь ?


Eraser   (2006-01-25 17:21:00) [3]


> Игорь Степанов   (25.01.06 16:08) [5]

Думаю надо делать как

> Игорь Шевченко ©   (25.01.06 17:04) [6]

> Или установку высокого приоритета приложения.

+ использование ф-ии Sleep(n), где n примерно равно 8... сложно точности добиться будет, если вообще не возможно.
Можно разработать алгоритм, который эврестически будет вычислять при каждом запуске таймера/программы величину n.


MBo   (2006-01-25 17:15:00) [4]

>с угловой скоростью 1 оборот в секунду с шагом 8.33 миллисекунды. Всего 120 шагов.

Меня терзают смутные сомнения...
Такое количество кадров в секунду:
1. Не воспринимается  человеком
2. Трудно отобразить
3. Частоты обновления (кадровая) у абсолютного большинства мониторов не хватит (да и видеокарты обычно не поддерживают)


Игорь Шевченко   (2006-01-25 17:04:00) [5]


> Что бы вы могли посоветовать?


MS-DOS. Я серьезно. Или установку высокого приоритета приложения. Или смягчение требований к временным характеристикам.


Игорь Степанов   (2006-01-25 16:08:00) [6]

Для психофизиологического теста "Реакция на движущийся объект" мне надо обеспечить движение стрелки нарисованного на экране секундомера  с угловой скоростью 1 оборот в секунду с шагом 8.33 миллисекунды. Всего 120 шагов.

Вот поэтому мне и нужно обеспечить задержку между циклами перерисовки стрелки на 8.33 мсек.

Что бы вы могли посоветовать?

С уважением,

Игорь Степанов


Digitman   (2006-01-25 09:55:00) [7]


> Игорь Степанов   (25.01.06 09:45) [3]


Можно ли осведомиться, зачем понадобилась такая прецизионность и такая задержка ?

Сдается что копаешь ты не свой огород и не в ту сторону ...


Игорь Степанов   (2006-01-25 09:45:00) [8]

Спасибо.

1. Можно ли использовать функции типа QueryPerformanceFrequency и QueryPerformanceCounter?

2. Где находятся мультимедийные таймеры?

3. Каким способом можно добиться точности задержки в 0.1 мсек?

С уважением,

Игорь Степанов


Desdechado   (2006-01-24 22:27:00) [9]

тик<>мс
лучшее, чего мне удавалось добиваться таймерами - 12 мс

но для варианта загруженной многими задачами системы тебе ничего не поможет...


Rouse_   (2006-01-24 21:23:00) [10]

Такой точности ты не добьешся. Мультимедийные таймеры тебе нужны.
timeSetEvent и т.п.


Наверх

Титульная страница Поиск, карта сайта Написать письмо