Форум: "Сети";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
ВнизКак подождать результата соединения клиента с сервером? Найти похожие ветки
← →
Alibaba (2002-07-16 13:58) [0]Всем привет!
Такой вопрос:
Я пробую установить соединение клиента с сервером и в зависимости от результата (есть связь или нет) выполнять тот или иной код.
Схема такая:
clnSocket.Open;
(здесь необходимо подождать)
if clnSocket.Active then Procedure1
else Procedure2
Скажите, плиз, как организовать ожидание?
← →
Digitman (2002-07-16 14:35) [1]простейшая схема для неблокирующего однопоточного режима :
var
Ready: Boolean;
...
procedure TclnSocket.OnConnect(...);
begin
...
Ready := True;
end;
...
Ready := False;
clnSocket.Open;
while not Ready do
Application.ProcessMessages;
← →
Alibaba (2002-07-16 15:21) [2]Идея понятна.
Только маленькая поправка:
Type
TRes = (rsConnect, rsNotConnect);
Var
Ready: boolean;
rs: TRes;
mas : array[TRes] of string;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
Ready:=False;
mas[rsConnect]:="Успешное соединение";
mas[rsNotConnect]:="Подсоединиться не удалось";
end;
procedure TfrmMain.clnSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
rs:=rsConnect;
Ready:=True;
end;
procedure TfrmMain.clnSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
rs:=rsNotConnect;
Ready:=True;
Abort;
end;
procedure TfrmMain.Button3Click(Sender: TObject);
begin
clnSocket.Open;
while not Ready do
Application.ProcessMessages;
ShowMessage(mas[rs]);
end;
← →
Alibaba (2002-07-16 15:24) [3]Вот только мне хотелось использовать не
Application.ProcessMessages
а другой способ :
WaitForMultipleObjects
только я не знаю как его присоединить в данной ситуации... :(
← →
Digitman (2002-07-16 15:53) [4]Поправки ни к чему - сути не меняют, это все - ботва к корнеплоду))
Теперь - касаемо MsgWaitForMultipleObjects().
Поскольку ты ни слова не сказал о возможности мультипоточного режима, предполагаю, что ожидание события коннекта должно быть реализовано в том же (основном) потоке, где, собственно, и предпринимается попытка коннекта. И - опять же - предполагаю, что TClientSocket должен работать в неблок.режиме.
В случае использования стандартного TClientSocket (без доработок в наследнике) вызов WaitForMultipleObjects не удастся использовать по двум причинам :
1. Гнездо как ОС-ресурс фактически создается лишь непосредственно при вызове метода Open(). При этом гнездо инициализируется как объект, способный генерировать оконные статус-сообщения (см. WSAAsyncSelect, вызываемый по умолчанию в теле метода AsyncInitSocket() для неблок.режима). WSAAsyncSelect-режим явл-ся взаимоисключающим для WSAEventSelect-режима, установкой которого можно было бы подготовить гнездо к ожиданию асинхронных статус-событий с помощью последовательности вызовов WSACreateEvent() + WSAEventSelect() + WaitForMultipleObjects()/WSAEnumNetworkEvents. Т.о., из-за невозможности вызова WSAEventSelect() в произвольный момент времени вариант с ожиданием события по его хэндлу отпадает.
2. Даже если бы не было проблем, описанных в (1), ты получил бы зависание осн.потока на время с момента попытки коннекта до момента подтверждения коннекта (или отказа по ошибке) из-за того, что WaitForMultipleObjects() никак не реагирует на оконные сообщения. В этом плпне гораздо привлекательней выглядит MsgWaitForMultipleObjects(), но логика его использования во многом пересекается с логикой того же Application.ProcessMessages(), да и воспользоваться им все равно не удастся по уже изложенным причинам.
← →
Alibaba (2002-07-16 16:17) [5]Поправки иногда все-таки меняют суть.
Я не работал с MsgWaitForMultipleObjects.
У меня есть проекты где используется WaitForMultipleObjects.
Там действительно создается несколько Depend-потоков и я ожидаю в Master-потоке пока закончится один из них или все в зависимости от параметров, передаваемых функции WaitForMultipleObjects.
Скорее всего в однопоточной программе (имеется в виду обсуждаемый здесь вопрос) придется использовать Application.ProcessMessages и не усложнять жизнь.
Прокоментировать широкие теоретические выкладки к сожалению не могу - так глубоко с Socket-ами не работал. Небыло необходимости. Появится необходимость - буду копать.
← →
Digitman (2002-07-16 16:51) [6]Как угодно)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.094 c