Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
14-61259
BigBadMutuh
2002-08-17 01:33
2002.09.19
Нужен козырной снимок или рисунок бабочки.


1-61136
Andy BitOff
2002-09-06 14:03
2002.09.19
Виртуальный Grid


3-60940
Abu
2002-08-27 17:44
2002.09.19
проверка для Excel


4-61385
Eugene_Jek_Efimochkin
2002-07-17 23:37
2002.09.19
принимать ярлыки URL из IE


3-61013
lejik
2002-08-10 21:48
2002.09.19
Программное отключение от базы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский