[an error occurred while processing this directive]
|
Встречный вопрос. При этом параллельные процессы должны идти или просто нужно калиброванную задержку?
Все компоненты, о которых пойдет речь ниже, были взяты на 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