Текущий архив: 2006.04.16;
Скачать: CL | DM;
ВнизИспользование функции GetTickCount для создания задержки в 8 мсе Найти похожие ветки
← →
Игорь Степанов (2006-01-24 20:18) [0]Уважаемые мастера,
Я использую функцию API GetTickCount для задержки длительностью 8 мсек в следующем коде:
Var Time1,time2:Dword;
Time1:=GetTickCount;
repeat
Time2:=GetTickCount;
until (time2-time1)>=8;
Однако цикл срабатываетпри разности в 15 или 16 вместо 8 тиков.
В чём тут дело?
С уважением,
Игорь Степанов
← →
Rouse_ © (2006-01-24 21:23) [1]Такой точности ты не добьешся. Мультимедийные таймеры тебе нужны.
timeSetEvent и т.п.
← →
Desdechado © (2006-01-24 22:27) [2]тик<>мс
лучшее, чего мне удавалось добиваться таймерами - 12 мс
но для варианта загруженной многими задачами системы тебе ничего не поможет...
← →
Игорь Степанов (2006-01-25 09:45) [3]Спасибо.
1. Можно ли использовать функции типа QueryPerformanceFrequency и QueryPerformanceCounter?
2. Где находятся мультимедийные таймеры?
3. Каким способом можно добиться точности задержки в 0.1 мсек?
С уважением,
Игорь Степанов
← →
Digitman © (2006-01-25 09:55) [4]
> Игорь Степанов (25.01.06 09:45) [3]
Можно ли осведомиться, зачем понадобилась такая прецизионность и такая задержка ?
Сдается что копаешь ты не свой огород и не в ту сторону ...
← →
Игорь Степанов (2006-01-25 16:08) [5]Для психофизиологического теста "Реакция на движущийся объект" мне надо обеспечить движение стрелки нарисованного на экране секундомера с угловой скоростью 1 оборот в секунду с шагом 8.33 миллисекунды. Всего 120 шагов.
Вот поэтому мне и нужно обеспечить задержку между циклами перерисовки стрелки на 8.33 мсек.
Что бы вы могли посоветовать?
С уважением,
Игорь Степанов
← →
Игорь Шевченко © (2006-01-25 17:04) [6]
> Что бы вы могли посоветовать?
MS-DOS. Я серьезно. Или установку высокого приоритета приложения. Или смягчение требований к временным характеристикам.
← →
MBo © (2006-01-25 17:15) [7]>с угловой скоростью 1 оборот в секунду с шагом 8.33 миллисекунды. Всего 120 шагов.
Меня терзают смутные сомнения...
Такое количество кадров в секунду:
1. Не воспринимается человеком
2. Трудно отобразить
3. Частоты обновления (кадровая) у абсолютного большинства мониторов не хватит (да и видеокарты обычно не поддерживают)
← →
Eraser © (2006-01-25 17:21) [8]
> Игорь Степанов (25.01.06 16:08) [5]
Думаю надо делать как
> Игорь Шевченко © (25.01.06 17:04) [6]
> Или установку высокого приоритета приложения.
+ использование ф-ии Sleep(n), где n примерно равно 8... сложно точности добиться будет, если вообще не возможно.
Можно разработать алгоритм, который эврестически будет вычислять при каждом запуске таймера/программы величину n.
← →
Digitman © (2006-01-25 17:22) [9]
> шагом 8.33 миллисекунды
откуда взялась сия цифирь ?
← →
Игорь Степанов (2006-01-26 21:36) [10]Уважаемые мастера,
Действительно, функция 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 мсек. Тем не менее, можно рассчитать поправочный коэффциент и обеспечить приемлемую точность. Таким образом, для моих целей этот подход вполне подходит.
Благодарю за участие в дискуссии.
С уважением,
Игорь Степанов
Страницы: 1 вся ветка
Текущий архив: 2006.04.16;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.039 c