Форум: "Сети";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизINDY, компонент TCP/IP Найти похожие ветки
← →
bykopor © (2004-02-13 11:39) [0]У меня при приеме клиентом с сервера пакетов виснет прога.
типаprocedure TForm1.Timer1Timer(Sender: TObject);
var
s:string;
begin
if client.Connected then
s:=client.ReadLn("",5);
end;
← →
Verg © (2004-02-13 12:09) [1]Какая прога виснет?
Тут приведен код обработчика таймера.
Этот код ни о чем не говорит.
Это все равно, что написать
"У меня виснет прога:
a := b;
"
← →
Digitman © (2004-02-13 15:22) [2]дурней не придумаешь - по таймеру да еще с таймаутом работать с сетевым транспортом
← →
h0use © (2004-02-13 15:48) [3]Есть мнение, что пра заводить FAQ по Indy :)
А пока стандартный совет попробовать для начала idAntiFreeze
← →
Digitman © (2004-02-13 15:51) [4]
> h0use © (13.02.04 15:48) [3]
есть мнение выкинуть Инди в мусорное ведро, оставив только pas-файлы как один из примеров использования WS2 и высокоуровневых прикл.протоколов инф.обмена
imho
← →
h0use © (2004-02-13 16:05) [5]Согласен, но например некоторым нужно склепать нечто достаточно быстро и разбираться в тонкостях WS2 и писать свои библиотеки некогда. Была бы аналогичная по функциональности библиотека, я бы с радостью забросил Инди, но нету :( А в WS2 я не силен, вот и приходиться заниматься извратом.
← →
Digitman © (2004-02-13 16:07) [6]понахреноверчено там - ой-ой ! ... якобы из соображений потенциальной кроссплатформенности ... замесили транспорт и высокоуровневые протоколы в одну кучу - сиди и разбирайся сутки напролет, где там и откуда какие ноги растут)
то ли дело - старый добрый scktcomp.pas !
чистой воды транспорт) ... хошь - пользуй as is, а хошь - обертывай своими классами и наворачивай доп.возможности)
← →
Digitman © (2004-02-13 16:12) [7]
> h0use © (13.02.04 16:05) [5]
берешь scktcomp, организуешь на базе его только транспорт
работает это без вопросов, вполне надежно и быстро
а что касается "наворотов" а-ля http, pop, smtp, ftp и иже с ними - ищешь соотв. RFC и реализуешь как совершенно автономный алгоритм, никак не связанный с транспортом ...
т.е. мухи - отдельно, котлеты - отдельно ...
все чистенько, прозрачно и понятно в этом случае становится
← →
Verg © (2004-02-13 16:35) [8]
> h0use © (13.02.04 15:48) [3]
> Есть мнение, что пра заводить FAQ по Indy :)
>
> А пока стандартный совет попробовать для начала idAntiFreeze
Такой код не должен приводить к зависанию проги сам по себе. Т.е. либо зависание происходит где-то в другом месте, либо автор словом "виснет" обозначает что-то другое.
← →
Verg © (2004-02-13 16:44) [9]А насчет самой по-себе Indy я не буду столь категоричен. Реализовано там на самом деле много чего из протоколов уровня приложения.
Indy реализации этих протоколов я считаю самым ценным в самой Indy.
Некая "корявость" наблюдается только и именно в реализации транспорта.
← →
Digitman © (2004-02-13 16:55) [10]
> Verg © (13.02.04 16:44) [9]
действительно - в момент блокирующего ожидания трансп.событий по таймауту управляющий транспортом код, предположим, захочет терминировать транспортную сессию ... а та "торчит" на каком-нить задрипаном select"е
← →
h0use © (2004-02-13 16:59) [11]
> Такой код не должен приводить к зависанию проги сам по себе.
Именно там и виснет автор, потому как он сам написал, что зависание происходит при ожидании сообщения от сервака, это типичное состояние Инди, так как процедура чтения из сокета останавливает кодовый поток до получения каких-либо данных. Выхода два, либо открывать и закрывать соединение до и после передачи данных, либо вешать антифриз. Можно еще отдельный поток создать для Инди.
← →
Digitman © (2004-02-13 17:09) [12]антифриз этот хваленый, насколько мне стало очевидно из достаточно беглого обзора исх-ком Инди, выполняет свои ф-ции в промежутке между возвратами из select"ов
← →
Verg © (2004-02-13 17:10) [13]
> h0use © (13.02.04 16:59) [11]
>
> > Такой код не должен приводить к зависанию проги сам по
> себе.
>
>
> Именно там и виснет автор, потому как он сам написал, что
> зависание происходит при ожидании сообщения от сервака,
> это типичное состояние Инди, так как процедура чтения из
> сокета останавливает кодовый поток до получения каких-либо
> данных. Выхода два, либо открывать и закрывать соединение
> до и после передачи данных, либо вешать антифриз. Можно
> еще отдельный поток создать для Инди.
Нет, я тут с тобой не согласен. Там явно указан таймаут 5- миллисекунд. Никакого повисания быть не может.
Единственный вариант - это квазизависание, т.е. если у TTimer, обработчик котого приведен установить Interval < 5 миллисекунд.
← →
Dubensky © (2004-02-13 20:50) [14]Ничего подобного, у меня на таймере стоит Interval=500, а Антифриз на 250 милисек.
Подвисать перестало, возможность перемещаться по контролам внутри формы запросто, вот только переместить форму НЕ реально.
Мышь не реагирует на заголовке, и САМОЕ угарное что таскбар тоже не хочет перемещаться, пока не потеряешь фокус с формы где инди.
Косячек у них конечно непреличный. Ж-)))
А насчет фака это мысль КЛАСНАЯ.
А кто подскажет чем можно заменить? Может сторонние компоненты есть хорошие?
PS: Смысл моей проги, корпоративная аска.
← →
Digitman © (2004-02-14 11:18) [15]
> PS: Смысл моей проги, корпоративная аска.
изобретение еще одного "корпоративного велосипеда"
ICQ GroupWare уже есть у Мирабилиса ... и давно
← →
Verg © (2004-02-14 15:15) [16]В любом случае, единственным полноценным способом избавится от этих "тормозов" "замираний" и проч. при использовании клиентских компонент Indy или классов Synapse уровня транспорта - это всю работу поместить в отдельный поток. Именно всю, а не только, например, стадию connect.
Ну сделан этот транспорт так - ориентирован на блокирующий режим сокетов. И никакой там антифриз не даст идеального результата. Антифриз - это некий самообман, иллюзия неблокирующей работы, "дурилка картонная"...
Серверная часть Indy по сути так и делает, и поэтому работа серверных компонент выглядит намного более достойно.
← →
Digitman © (2004-02-14 16:24) [17]
> Verg © (14.02.04 15:15) [16]
> Антифриз - это некий самообман, иллюзия неблокирующей работы,
> "дурилка картонная"...
согласен полностью
здесь другой вопрос - что, на Инди свет клином сошелся ?
мало ли прочих 3rd-party-пакетов ?
мне вот , к примеру, оч даже импонирует в этом и многих других планах весьма серьезный пакет ASTA разработки AstaTech Corp.
там и транспорт отточен/отлажен, и оболочка весьма продумана
← →
bykopor © (2004-02-16 09:28) [18]Так вот прога выснет когда я пробую получить пакет.
И с таймаутом и без него
← →
Digitman © (2004-02-16 09:57) [19]
> bykopor © (16.02.04 09:28) [18]
тебе уже сказали, что самый простой (но далеко не самый лучший и не всегда подходящий) выход их ситуации - использование компонента TIdAntifreeze
← →
Verg © (2004-02-16 10:53) [20]
> bykopor © (16.02.04 09:28) [18]
Вот, попробуй, прога с единственной формой:unit ITestMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient;
type
TForm1 = class(TForm)
IdTCPClient1: TIdTCPClient;
Timer1: TTimer;
Button1: TButton;
// Никаких "антифризов", вообще ничего больше нет. Просто - как три рубля.
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
s:string;
begin
if IDTcpClient1.Connected then
s:=IDTcpClient1.ReadLn("",5);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
IDTcpClient1.Host := "www.mail.ru";
IDTcpClient1.Port := 80;
IDTcpClient1.Connect;
Timer1.Interval := 200;
Timer1.Enabled:=true;
end;
end.
Это - прога, и ЭТА прога НЕ виснет. Хотя после соединения (успешного) тот сервер НИЧЕГО НЕ ПЕРЕДАЕТ.
Какая твоя прога ВИСНЕТ - я не знаю, тем более уж виноват ли в этом Indy?
← →
DAnton (2004-02-16 12:28) [21]Доброго времени суток всем.
Многое было сказано по этой теме, сам мучаюсь с этим примером и испытываю полное негодование.
Без Антифриза у меня вешается полностью прога.
С Антифризом, всё нормально (относительно), если не считать что мышу не слушает форма (не перетащить, ни в поле какое-либо перейти), а клава пашет стабильно.
Пробовал под всеми виндами.
Вот кто ЭТО может объяснить. тот настоящий дельфист?
Ж-))))
← →
Verg © (2004-02-16 12:36) [22]
> DAnton (16.02.04 12:28) [21]
Вот понимаешь, у меня D6 Pro в стандартной поставке со всеми Update-pack - ами.
И у меня приведенная мною программа не виснет, и мышь и клава работают, а так же принтер, сидиром, сканер и проч. компъютерное оборудование исправно работает.
Вам что, еще долго объяснять КАК надо задавать подобные вопросы?
Приведи упрощенный пример совей проги, но где бы воспроизводился этот глюк.
Понимаешь, а иначе - пустой базар, фуфло, ля-ля-тополя, прости Господи....
← →
DAnton (2004-02-16 15:39) [23]Простите, простите.
← →
bykopor © (2004-02-17 14:30) [24]
> Verg
Кстати, в 6 Делфи эта байда нифига не виснет!!!!!
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.031 c