![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование функции 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 и т.п.