Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IdTCPClient [D6, Win2k]


Страницы:   1 2 3 4

Manulo ©   (2004-02-09 18:47:00) 

Что можно сделать, что бы он не вешал приложение при коннекте, если удалённый хост долго (или совсем) не отвечает?


Verg   (2004-02-11 09:35:00) [21]

А в чем проблемы?
Давненько сам ничего не сносил, но Component|Install Packages - там выбираешь нужный пакет и нажимаешь Remove.


Manulo   (2004-02-10 19:54:00) [22]


> Verg ©   (10.02.04 19:19) [41]

я имею в виду, что я дня три пытался найти, где задаётся тайм аут :)

Кстати, вопрос в догонку. Как правильно из 6-й делфи удалить какой нибуть пакет компонентов (напр. Инди 8) :) А то после моего ручного хирургического вмешательства она стала дико глючить и при попытке добавить на форму компонент вываливается с дикими криками "Ошибка в такой-то BPL-ке"


Verg   (2004-02-10 19:19:00) [23]


> Manulo ©   (10.02.04 17:25) [40]
>
> > Verg ©   (10.02.04 17:02) [38]
>
> мдя... дня три ускал когда то, где можно тайм-аут перехватить...
> А всё оказалось до обидного просто :(


Дня три?
Ты знаешь, у родной поставки Indy (с D6) этого таймаута просто не было и быть не могло...


Manulo   (2004-02-10 17:25:00) [24]


> Verg ©   (10.02.04 17:02) [38]

мдя... дня три ускал когда то, где можно тайм-аут перехватить... А всё оказалось до обидного просто :(


h0use   (2004-02-10 17:23:00) [25]

Там еще глобальный таймаут есть у всей компоненты ;)


Verg   (2004-02-10 17:02:00) [26]

Да, кстати, как это "где"?
Вот смотрю на исходник, вижу:

procedure TIdTCPClient.Connect(const ATimeout: Integer = IdTimeoutDefault);


Verg   (2004-02-10 16:59:00) [27]


> Manulo ©   (10.02.04 16:57) [36]


Упс... Хо-ороший вопрос. :)
Надо глянуть....


Manulo   (2004-02-10 16:57:00) [28]


> Verg ©   (10.02.04 16:30) [32]

Ты мне ещё скажи как в idTCPClient тайм-аут задать, так точно проэксперемнтирую :)


Verg   (2004-02-10 16:50:00) [29]


> Reindeer Moss Eater ©   (10.02.04 16:45) [34]
> Как часы он может и работает.
> Только ничего кроме соединения точка-точка не умеет.
>
> А клиенту подавай работу через целый список типов прокси
> и прочие фичи.


Что есть, то есть.
Я разве возражаю?

Главное отдавать себе отчет при использовании черных ящиков в том, на "каком бензине они ездят", чтобы  изначально правильно построить проект, на них ориентированный.


Reindeer Moss Eater   (2004-02-10 16:45:00) [30]

Как часы он может и работает.
Только ничего кроме соединения точка-точка не умеет.

А клиенту подавай работу через целый список типов прокси и прочие фичи.


Verg   (2004-02-10 16:31:00) [31]


> h0use ©   (10.02.04 16:29) [31]
>
> >  Winsock асинхронный режим (TClientSocket) - это как ввод
>
> > по прерываниям.
>
> Если бы он коннекта не терял по неопознанным причинам, то
> цены бы ему не было, а так приходится Indy с антифризом
> юзать как псевлоасинхронку :(


Нет, работает TClientSocket как часы, поверь мне. Где-то ты в коде "намудрил".


Verg   (2004-02-10 16:30:00) [32]


> Manulo ©   (10.02.04 16:22) [30]


Отлично. Теперь попробуй вот что:
Попробуй соединится на какой-нибудь ip-шник в сети (но не в локальной, конечно), но на котором, точно никого нет (пропингуй там или как).
Но тайм-аут соединения поставь заведомо меньше, чем требуется для того, чтобы connect-ту "обнаружить, что нет живых" на этом IP.
Сколько будет выполнятся ф-ция IdTCPClient.Connect в таком случае?

Я делаю ставку на то, что она будет выполнятся дольше, чем ты указал в таймауте :)))


h0use   (2004-02-10 16:29:00) [33]


>  Winsock асинхронный режим (TClientSocket) - это как ввод
> по прерываниям.

Если бы он коннекта не терял по неопознанным причинам, то цены бы ему не было, а так приходится Indy с антифризом юзать как псевлоасинхронку :(


Manulo   (2004-02-10 16:22:00) [34]


> Verg ©   (10.02.04 15:51) [27]

Не знал, что установка 9-й версии поверх 8-й такой трудоёмкий и опасный процесс...

Поставил девятые, перекомпилил (ни кода, ни property) не трогал. При запуске сначала разницы не увидел (у меня по таймеру пропинговаваются серваки по заданному списку), то есть было лёгкое подтормаживание если удалённый сервер включён, но порт закрыт, потом попустило :)
самый волнующий моментю когда физически выдернул сетевой шнурок из розетки... тайм аут выжыдался чесно, но приложение НЕ ВИСЕЛО! :) Чего и требовалось достичь
Исходники приведены выше, на форме ещё валялся АнтиФриз.


Verg   (2004-02-10 16:03:00) [35]


> h0use ©   (10.02.04 15:52) [28]
> Отлично...а что сделать, чтоб приложение не вешалось при
> ожидании сообщения от сервера?


Ну тут-то должен помочь антифриз.

И опять же с той оговоркой, что индевый ReadBuf (или как там у них) НЕ вернется до тех пор, пока не получит таки заказанное тобою количество байт.

Ну или сам вызывай этот, как его там..... ReadFromStack по таймеру или еще как-нибудь, пока не соберется нужного количества байтов.

Ну аналогии-то очевидны. Indy - это как ввод информации опросом готовности порта,
а Winsock асинхронный режим (TClientSocket) - это как ввод по прерываниям.


h0use   (2004-02-10 15:52:00) [36]

Отлично...а что сделать, чтоб приложение не вешалось при ожидании сообщения от сервера?


Verg   (2004-02-10 15:51:00) [37]


> Manulo ©   (10.02.04 15:41) [26]
>
> > Verg ©   (10.02.04 15:17) [23]
>
> то есть, по твоему установка 9-х индей решит проблему? Поэксперементируем



> Т.е. все равно, получается, что пока соединение происходит,
> IDTCPClient.Connect НЕ вернет управления. Хотя и будет происходить
> диспетчерезация сообщений главным потоком.


Если тебя вот это устроит, то "решит", наверно :)
Экспериментируй, конечно: одна маленькая практика стоит большой теории...
Не забудь сюда сообщить результаты, ОК ?

Кроме того, на вот, почитай (только не обчитайся :)))

http://www.atozedsoftware.com/indy/Articles.iwp


Manulo   (2004-02-10 15:41:00) [38]


> Verg ©   (10.02.04 15:17) [23]

то есть, по твоему установка 9-х индей решит проблему? Поэксперементируем


Verg   (2004-02-10 15:38:00) [39]


> h0use ©   (10.02.04 15:22) [24]
>
> > Verg ©   (10.02.04 15:17) [23]
>
> Так-так, отсюда да поподробней...


Не, я знатоком по инди и не бывал. Ну не нужны они мне.

Однако иногда поглядываю туда...

Ну короче, в девятке, когда ты вызываешь IdTCPClient.Connect запускается поток, управлять которым ты не можешь, т.е. он скрытый от тебя полностью. Этот поток и производит попытку соединения, вызывая connect (блокирующий) из winsock. Пока этот поток выполняется ClientConnect кружит цикл, вызывая антифриз, который по их словам в свою очередь вызывает в том числе Applciation.ProcessMessages и котролируя таймайт. Если этот тайм-аут кончится раньше, чем поток закончит работу (вне зависимости от результата) Winsock.connect, то (!! :)) этот цикл говорит тому потоку Terminate (т.е. ставит флажок типа, только зачем?, если в этом потоке нет ни единого цикла) и потом WaitFor (надо же, так он и прервал им WinSock.connect раньше, чем тот сам захочет :))). Вот придется циклу поодождать таки, пока WinSock.Connect не закончит свое дело. Ну да ладно - это уже нюансы...
Т.е. все равно, получается, что пока соединение происходит, IDTCPClient.Connect НЕ вернет управления. Хотя и будет происходить диспетчерезация сообщений главным потоком.

Если интересно, возьми исходники на http://www.indyproject.orgи приглядис к файлу IdIOHandlerSocket.pas там это все, о чем я писал.
Ну уж как понял - так понял....


h0use   (2004-02-10 15:22:00) [40]


> Verg ©   (10.02.04 15:17) [23]

Так-так, отсюда да поподробней...


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо