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

Вниз

Как подождать результата соединения клиента с сервером?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
1-61094
Akim2
2002-09-09 19:55
2002.09.19
Помогите со StoredProcedure


3-60951
ppcat
2002-08-28 10:36
2002.09.19
Список доступных MS SQL серверов


7-61325
iii
2002-07-10 18:29
2002.09.19
Как убрать .CPL файл с Панели задач (Taskbar) ?


1-61038
Taifur
2002-09-06 11:28
2002.09.19
перетаскивание из приложения в приложение


1-61130
Jee
2002-09-06 14:42
2002.09.19
Как замучить DLL