Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.028 c
1-1080117606
LinOS
2004-03-24 11:40
2004.04.11
Закрытия окна при клике вне его пределов


14-1081675172
GanibalLector
2004-04-11 13:19
2004.04.11
Кличко


3-1081689688
Smile)))
2004-04-11 17:21
2004.04.11
Выделить в DBGRID всю строку


14-1079517949
blackman
2004-03-17 13:05
2004.04.11
Что дал переезд форума ?


3-1078999104
kvi
2004-03-11 12:58
2004.04.11
TClientDataSet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский