![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедура с фиксированным временем исполнения [D6, Win2k]
АлексейК © (2003-12-18 21:00:00)
Проблема такая. Необходимо чтобы процедура выполнялась 4 милисеккунды (допустим), хотя она отрабатывает за 1,5. Подскажите что делать?
P.S. Измерял время с помощью GetTickCount. При попытке контроля времени получается ерунда.
var
T: DWord;
begin
T:=GetTickCount+4;
...
{Тело процедуры}
...
while GetTickCount<T do;
end;
В этом случае меньше 10 мс не получается.
Slym (2003-12-25 06:30:00) [1]
Решение: драйвер...
Вычисляешь время выполнения "меандра"...
вычисляешь время выполнения операции
asm
1: dec eax
jnz 1
end;
отнимаешь от твоих 4мс "время выполнения "меандра""
и делишь на "время выполнения операции"
полученую циферку загоняешь в eax
запрешаешь прерывание (смотри ASM)
запускаешь меандр
запускаешь
asm
1: dec eax
jnz 1
end;
разрешаешь прерывания...
Slym (2003-12-25 06:21:00) [2]
В операционных системах с вытесняющей многозадачностью такое не дано!
Системный процесс с TimeCriticлом или хуже с RealTiмом прижмет твою прогу хоть на полчаса...
+Такое понятие как прерывание вам знакомо? ну форматирование дискетки вспомните... да... вот оно... любое прерывание хуже RealTime процесса и обойти его можно только запретив прерывания... но в Windows этого без драйвера не сделать :)
да и представь такое... кому не лень будут запрещать прерывания на N времени...
АлексейК (2003-12-24 23:57:00) [3]
Нет, SetWaitableTimer не помогло.
А задача в следующем: надо в течении (период) 4 мс.(4 дано для примера) посылать в порт(LPT1) 1/0 , т.е. формировать меандр с частотой от 100 до 1000 Герц.
Вот такая фигня!
P.S. А нельзя это характерное время переключения потоков как-нибудь уменьшить, хотя бы до 2 мс. ?
MBo (2003-12-19 09:08:00) [4]
А вообще нужно задачу описать, тогда может и решение найтись
MBo (2003-12-19 09:05:00) [5]
Именно так - >чтобы процедура выполнялась 4 милисеккунды
сделать в Windows нельзя. 10 мс - характерное время переключения потоков для NT-систем.
Попробуй SetWaitableTimer (Win2K и выше)