IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Цикл по времени (https://www.imho.ws/showthread.php?t=36087)

Occtider 08.08.2003 01:47

Цикл по времени
 
Как можно сделать на delphi так, что бы цикл выполнялся пока не прошло определенное время? Суть в том, что программа должна ждать в течении, например, 0.1с ответа от внешнего устройства, и в случае не получения прирываться через вышеуказаный промежуток времени.
Можно ли на delphi, каким-либо образом "зацепиться" за аппаратное прерывание?

Flex256 08.08.2003 08:01

Если делать "в лоб", то перед циклом делаешь GetTickCount - получаешь время
и в цикле постоянно GetTickCount
разница между этими двумя значениями и будет время (в милисекундах), прошедшее с начала цикла...

aleh 08.08.2003 09:46

Вообщето, при работе с устройствами, используются прерывания. А таймер вешается дополнительно. Это делается чтобы оперативно реагировать на данные/состояние устройства + НЕ жрать ресурсы процессора (!!!)

В Delphi особых изощрений не выйдет. Если ты используешь промещуточное API, то обычно в него закладывается работа с TimeOut. Если же такого нет, или орудуешь напрямую, то лучше сделать следующее.
1) Разбить время ожидания на мелкие порции по 10-100 милисекунд. (Многие устройства поддерживают буферизацию, даже на COM порт есть аппаратная очередь на 14-15 байт. Поэтому нет смысла опрашивать слишком часто -- берёшь в руки калькулятор и считаешь сколько ждать нужно)
2) Опрашивать состояние портов (ещё чего нибудь) и "спать" на эти милисекунды -- Нужно отдавать время другим процессам, чтобы Windows не замерзал. Тут ещё нужно не забыть, чтобы прорисовывался интерфейс самой программы :)

Хотя можно оставить и цикл, только внутри него запускать процедуру ... чтоб её, запамятовал :(, вроде типа Application.ProcessMessages (Delphi под рукой нет, посмотреть не могу)

mozarttt 10.08.2003 00:47

var
starttime,timeout: Integer
begin
timeout := 6000; // в мсекундах
starttime := GetTickCount;
while GetTickCount < (starttime + timeout) do
begin
....... //творим что хотим
if (....) then Break;
Application.ProcessMessages;
end;
end;

Occtider 16.08.2003 04:14

Спасибо, попробую.


Часовой пояс GMT +4, время: 13:41.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.