imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 08.08.2003, 01:47     # 1
Occtider
Guest
 
Сообщения: n/a

Цикл по времени

Как можно сделать на delphi так, что бы цикл выполнялся пока не прошло определенное время? Суть в том, что программа должна ждать в течении, например, 0.1с ответа от внешнего устройства, и в случае не получения прирываться через вышеуказаный промежуток времени.
Можно ли на delphi, каким-либо образом "зацепиться" за аппаратное прерывание?
 
Старый 08.08.2003, 08:01     # 2
Flex256
Guest
 
Сообщения: n/a

Если делать "в лоб", то перед циклом делаешь GetTickCount - получаешь время
и в цикле постоянно GetTickCount
разница между этими двумя значениями и будет время (в милисекундах), прошедшее с начала цикла...
 
Старый 08.08.2003, 09:46     # 3
aleh
Junior Member
 
Регистрация: 27.12.2002
Адрес: Belarus
Сообщения: 129

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

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

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

Последний раз редактировалось aleh; 08.08.2003 в 09:50.
aleh вне форума  
Старый 10.08.2003, 00:47     # 4
mozarttt
Junior Member
 
Аватар для mozarttt
 
Регистрация: 05.05.2003
Адрес: где то рядом
Сообщения: 120

mozarttt Путь к славе только начался
var
starttime,timeout: Integer
begin
timeout := 6000; // в мсекундах
starttime := GetTickCount;
while GetTickCount < (starttime + timeout) do
begin
....... //творим что хотим
if (....) then Break;
Application.ProcessMessages;
end;
end;
mozarttt вне форума  
Старый 16.08.2003, 04:14     # 5
Occtider
Guest
 
Сообщения: n/a

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

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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