| imho.ws |
![]() |
|
|
|
# 1 |
|
Guest
Сообщения: n/a
|
Цикл по времени
Как можно сделать на delphi так, что бы цикл выполнялся пока не прошло определенное время? Суть в том, что программа должна ждать в течении, например, 0.1с ответа от внешнего устройства, и в случае не получения прирываться через вышеуказаный промежуток времени.
Можно ли на delphi, каким-либо образом "зацепиться" за аппаратное прерывание? |
|
|
# 3 |
|
Junior Member
Регистрация: 27.12.2002
Адрес: Belarus
Сообщения: 129
![]() |
Вообщето, при работе с устройствами, используются прерывания. А таймер вешается дополнительно. Это делается чтобы оперативно реагировать на данные/состояние устройства + НЕ жрать ресурсы процессора (!!!)
В Delphi особых изощрений не выйдет. Если ты используешь промещуточное API, то обычно в него закладывается работа с TimeOut. Если же такого нет, или орудуешь напрямую, то лучше сделать следующее. 1) Разбить время ожидания на мелкие порции по 10-100 милисекунд. (Многие устройства поддерживают буферизацию, даже на COM порт есть аппаратная очередь на 14-15 байт. Поэтому нет смысла опрашивать слишком часто -- берёшь в руки калькулятор и считаешь сколько ждать нужно) 2) Опрашивать состояние портов (ещё чего нибудь) и "спать" на эти милисекунды -- Нужно отдавать время другим процессам, чтобы Windows не замерзал. Тут ещё нужно не забыть, чтобы прорисовывался интерфейс самой программы ![]() Хотя можно оставить и цикл, только внутри него запускать процедуру ... чтоб её, запамятовал , вроде типа Application.ProcessMessages (Delphi под рукой нет, посмотреть не могу)
Последний раз редактировалось aleh; 08.08.2003 в 09:50. |
|
|
|
|
# 4 |
|
Junior Member
Регистрация: 05.05.2003
Адрес: где то рядом
Сообщения: 120
![]() |
var
starttime,timeout: Integer begin timeout := 6000; // в мсекундах starttime := GetTickCount; while GetTickCount < (starttime + timeout) do begin ....... //творим что хотим if (....) then Break; Application.ProcessMessages; end; end; |
|
|