[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено John 11 декабря 2002 г. 18:18
В ответ на: Существует ли компонент для Delphi, чтобы получать задержки около 1 мс или меньше? отправлено zsn 11 декабря 2002 г. 17:03

Встречный вопрос. При этом параллельные процессы должны идти или просто нужно калиброванную задержку?
Все компоненты, о которых пойдет речь ниже, были взяты на www.torry.net . Я использую только те, что даются с исходниками - для переносимости.
В первом случае нужно использовать компоненты на основе мультимедийного таймера. Я пробовал CairnTimer. Он дает разрешение, близкое к 1 мс, если установить свойства
Resolution := 1;
TimerPriority := tpTimeCritical;
При этом все остальное не тормозится.

Если просто задержка, то там же можно поискать, если не ошибаюсь, ZTimer. Про него написано, что у него разрешения до 100 мкс, но это не настоящий таймер, а устроство генерации задержек - пока он считает, все остальное стоИт.

Ну, и задержки можно делать калиброванным циклом For. Например, так:
var
{ Длительность задержки на 1 мкс в циклах For }
DelayCount : dword;

{---------------------------------}
{ Калибровка скорости работы компьютера }
procedure CalibrDelay;
var
PriorityClass, Priority : integer;
i, L, RN, RK : dword;
begin
PriorityClass := GetPriorityClass ( GetCurrentProcess );
Priority := GetThreadPriority ( GetCurrentThread );
{ Определение количества циклов задержки на мкс }
SetPriorityClass ( GetCurrentProcess, REALTIME_PRIORITY_CLASS );
SetThreadPriority ( GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL );
L := 1000;
Repeat
L := L * 10;
RN := GetTickCount;
For i := 1 to L do;
RK := GetTickCount;
until ( RK - RN ) > 100;
DelayCount := Round ( L / 1000 / ( RK - RN ) );
If DelayCount = 0
then DelayCount := 1;
SetThreadPriority ( GetCurrentThread, Priority );
SetPriorityClass ( GetCurrentProcess, PriorityClass );
end; { CalibrDelay }

{---------------------------------}
{ Задержка на мкс }
procedure DelayUS ( US : dword );
var
i, L : dword;
begin
L := US * DelayCount;
For i := 1 to L do;
end; { TMainForm.DelayUS }

DelayUS в программе должна быть в скобках
PriorityClass := GetPriorityClass ( GetCurrentProcess );
Priority := GetThreadPriority ( GetCurrentThread );
{ Определение количества циклов задержки на мкс }
SetPriorityClass ( GetCurrentProcess, REALTIME_PRIORITY_CLASS );
SetThreadPriority ( GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL );
DelayUS ( ..);
SetThreadPriority ( GetCurrentThread, Priority );
SetPriorityClass ( GetCurrentProcess, PriorityClass );

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru