![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IdTCPClient [D6, Win2k]
Manulo © (2004-02-09 18:47:00)Что можно сделать, что бы он не вешал приложение при коннекте, если удалённый хост долго (или совсем) не отвечает?
Verg (2004-02-10 15:17:00) [41]
> Manulo © (10.02.04 14:49) [22]
Стоп, стоп... Дык в какой-то из 9-х версий Indy connect и так уже выделен в отдельный поток.
Или я ошибаюсь?
Т.е. В той, которая идет с D6 connect блокирующая операция и никакой антифриз там не поможет.
А вот в девятке, по-моему уже они припаяли тут Thread. На коннекте запускают его, он делает блокирующий connect, а в это время главный потоку кружится в цикле с антифризом, ожидая, пока этот поток не завершится.
Manulo (2004-02-10 14:49:00) [42]
type TTransportThread = class(TThread)
private
FRemoteHost : String;
FRemotePort : Integer;
FClient : TidTCPClient;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean = false);
procedure set_rem_host(host:string);
end;
var TransportThread : TTransportThread;
constructor TTransportThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
end;
procedure TTransportThread.set_rem_host(host:string);
begin
FRemoteHost:=host;
FRemotePort:= 1500;
end;
procedure TTransportThread.Execute;
var s : string;
i : integer;
begin
try
FClient := TidTCPClient.Create(nil);
try
try
EndWorkFlag:=false;
FClient.Host := FRemoteHost;
FClient.Port := FRemotePort;
FClient.Connect;
if FClient.Connected then FClient.WriteLn('ping');
if FClient.Connected then s:=FClient.ReadLn;
FClient.Disconnect;
form1.PingAnalis(s);
except
form1.Memo1.Text:=form1.Memo1.Text+'ERROR!';
end;
finally
FClient.Free;
end;
except
//..лог исключений
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TransportThread:=TTransportThread.Create(true);
// :=new(TTransportThread); //выдаёт ошибку
// New(TTransportThread,create(true)); //выдаёт ошибку
end;
procedure TForm1.ping_timerTimer(Sender: TObject);
begin
TransportThread.set_rem_host(get_ip);
TransportThread.Execute;
end;
> А IdAntiFreeze не помогает?
Нет, хотя может быть я не совсем разобрался, как им пользоваться
Vogus (2004-02-10 14:37:00) [43]Может я чего-то не понимаю: А IdAntiFreeze не помогает?
Verg (2004-02-10 14:34:00) [44]
> Manulo © (10.02.04 14:23) [19]
> Но всё равно, неужто ни у кого не получилось решить проблему
> "тормозов"?
В рамках блокирующих сокетов - единственным приближением к решению проблемы "тормозов" (я так понял, что имеется ввиду connect) является отдельный код. поток для этого.
Manulo (2004-02-10 14:23:00) [45]
> h0use © (10.02.04 14:10) [17]
Асинхронности точно не будет...
Но всё равно, неужто ни у кого не получилось решить проблему "тормозов"?
Verg (2004-02-10 14:23:00) [46]
> Manulo © (10.02.04 14:07) [16]
>
> > Но, насколько я понял, всем полюбились именно Indy.
>
>
> С TClient(Server)Socket была тоже не вполне понятная проблема,
> когда коннект вроду бы и есть, а данные вроде бы и не идут
> :( Поэтому использую Indy... И если бы не тормоза.....
Да, видимо, Indy и подкупает своей "очевидностью" так сказать "drop and play".
DOS конечно не WinXP, но зато как все просто и понятно...
> h0use © (10.02.04 14:10) [17]
>
> > Manulo © (10.02.04 14:07) [16
>
> Именно по той же самой причине перелез на Инди, но вот уже
> смотря 9-ю и 10-ю версию с сожалением вижу, что асинхронности
> там нет и судя по всему не будет, как и поддержки Winsock2
> :(
Дык я ж говорю - видимо целью проекта Indy и была как раз кроссплатформенность, т.е. им нельзя было расчитывать на такие возможности/особенности сокетного ядра Windows, которые нельзя бы было воспроизвести под Линуксом.
h0use (2004-02-10 14:10:00) [47]
> Manulo © (10.02.04 14:07) [16
Именно по той же самой причине перелез на Инди, но вот уже смотря 9-ю и 10-ю версию с сожалением вижу, что асинхронности там нет и судя по всему не будет, как и поддержки Winsock2 :(
Manulo (2004-02-10 14:07:00) [48]
> Но, насколько я понял, всем полюбились именно Indy.
С TClient(Server)Socket была тоже не вполне понятная проблема, когда коннект вроду бы и есть, а данные вроде бы и не идут :( Поэтому использую Indy... И если бы не тормоза.....
Reindeer Moss Eater (2004-02-10 12:33:00) [49]Интересно, а кто-нибудь пробовал к TidTCPServer присоединить TTCPClient?
Если включить телепатию и перевести твой вопрос на русский, то :
попробовали сами авторы библиотеки, создав класс TidTCPConnection
Verg (2004-02-10 12:28:00) [50]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1075625924&n=4
Там найдешь ссылку где взять Winsock2.pas
Verg (2004-02-10 12:22:00) [51]
> h0use © (10.02.04 12:12) [11]
> Кстати, как задействовать Winsock2?
Что значит "как"?
Брать, да пользоваться расширенными функциями Winsock2.
Или я не понял вопроса.
Digitman (2004-02-10 12:20:00) [52]
> h0use © (10.02.04 12:12) [11]
> Кстати, как задействовать Winsock2?
uses Winsock2
h0use (2004-02-10 12:12:00) [53]Кстати, как задействовать Winsock2?
Verg (2004-02-10 12:06:00) [54]
> Erik © (10.02.04 11:55) [8]
> Есть такая проблема и частично решается она через установку
> TimeOut. Для избежания ее ненадо создовать конектов!
>
> P.S.
> Нет человека, нет проблемы. :)
> P.S.S.
> Еще UDP можно воспользоватся.
На самом деле, для избежания этих проблем ДДБ навернул на неблок. режим сокетов еще один - асинхронный, ДДБ "завернул" это в T(Client/Server)Socket. Правда остались невопощенными в компоненты возможности Winsock2....
Но, насколько я понял, всем полюбились именно Indy. Видимо всем надо переносимость под Kylix....
PS
ДДБ - Добрый Дядя Билл
ДДБ - Добрый Дядя Борланд
Verg (2004-02-10 12:00:00) [55]
> h0use © (10.02.04 11:53) [7]
> Интересно, а кто-нибудь пробовал к TidTCPServer присоединить
> TTCPClient?
:)))
А в чем сомнения? Протокол-то один и тот же - TCP/IP.
Это ж всего лиш разные "обертки" одной и той же сущности - Socket Api.
Erik (2004-02-10 11:55:00) [56]Есть такая проблема и частично решается она через установку TimeOut. Для избежания ее ненадо создовать конектов!
P.S.
Нет человека, нет проблемы. :)
P.S.S.
Еще UDP можно воспользоватся.
h0use (2004-02-10 11:53:00) [57]Интересно, а кто-нибудь пробовал к TidTCPServer присоединить TTCPClient?
Verg (2004-02-10 11:37:00) [58]
> h0use © (10.02.04 11:27) [4]
> Присоединяюсь к пред. оратору [3]. Как Indy заставить в
> неблокируемом режиме работать?
По-моему никак.
Indy по-определению работает с сокетами в блок. режиме.
Если кто разбирался подробно, пусть меня поправит.
Вот в TTCPClient предусмотрен этот режим.
Reindeer Moss Eater (2004-02-10 11:36:00) [59]переписать его исходные тексты
h0use (2004-02-10 11:27:00) [60]Присоединяюсь к пред. оратору [3]. Как Indy заставить в неблокируемом режиме работать?