Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Синронизация   Найти похожие ветки 

 
Raduga   (2004-03-25 10:37) [0]

Здравствуйте, Мастера.
Возникла следующая проблема:в процедуре посылаю команду модему, необходимо приостановить выполнение программы до получения отклика модема на команду или истечения таймаута. Как выполнить синхронизацию?
Для работы с com-портом использую компонент MS Comm Control.


 
Digitman ©   (2004-03-25 10:55) [1]


> необходимо приостановить выполнение программы


точнее, наверно, выполнение следующих операторов в том кодовом потоке, который осуществляет управление модемом

если ты "приостановишь" осн.код.поток, пользователь не сможет взаимодействовать с твоим приложением, поскольку осн.код.поток отвечает за обработку GUI-сообщений/событий

я не в курсе, что из себя представляет MS Comm Control, но,
вероятно, следует использовать его либо в синхронном режиме (вынося весь код управления компонентом в доп.код.поток), либо использовать какие-то имеющиеся у компонента события ввода/вывода, которые возбуждаются компонентом в асинхронном режиме работы с портом


 
Raduga   (2004-03-25 11:08) [2]

>точнее, наверно, выполнение следующих операторов в том кодовом >потоке, который осуществляет управление модемом
Я именно это имел ввиду.
Данный компонент работает в асинхронном режиме, у него есть событие генерируемые при поступлении символов в принимающий буфер, как приостановить выполнение следующих операторов, пока "не сработает" событие компонента.


 
Digitman ©   (2004-03-25 12:37) [3]

ну, наверно, что-то вроде этого :

var
 Buffer: String;
 WaitTime: Integer;

procedure SomeObject.TimerTick;
begin
 Dec(WaitTime);
end;

procedure TCommControl.OnRead(...);
begin
 Buffer := Read(..);
end;

...

Buffer := "";
TimeOut := 10;
CommControl.Send(..);
SomeObject.Timer.Enabled := True;

while (Buffer = "") and  (TimeOut > 0) do
 Application.ProcessMessages;

SomeObject.Timer.Enabled := False;

if TimeOut > 0 then
ShowMessage("Превышен тайм-аут ожидания ввода");
else
ShowMessage("Получены данные : " + Buffer);


 
Raduga   (2004-03-25 13:06) [4]

Я как раз и использую этот способ. Просто хотел узнать "альтернативные" методы.
Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.035 c
4-1079939092
BillyJeans
2004-03-22 10:04
2004.04.11
WM_HOTKEY и NumLock...


11-1067529739
Fly`
2003-10-30 19:02
2004.04.11
KOL. Proxies.dcu


14-1079607716
Cobalt
2004-03-18 14:01
2004.04.11
Лечение в негосударственных мед. учреждениях


11-1067411606
SPeller
2003-10-29 10:13
2004.04.11
Интересно...


3-1081939231
31512
2004-04-14 14:40
2004.04.11
TClientDataSet.ApplyUpdates(0) & TClientDataSet.Refresh