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

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

виснет клиент из примера по Indy (Chat) [D7, Win2k]


john ©   (2003-12-27 07:05:00) 

там по таймеру выполняется:

if not IdTcpClient1.Connected then
   exit;

 Msg := IdTCPClient1.ReadLn('', 5);

 if Msg <> '' then
   if Msg[1] <> '@' then
     begin
     { Not a system command }
       memLines.Lines.Add(Msg);
     end
   else
     begin
     { System command }
       Com := UpperCase(Trim(Copy(Msg, 2, Pos(':', Msg) -2)));
       Msg := UpperCase(Trim(Copy(Msg, Pos(':', Msg) +1, Length(Msg))));
       if Com = 'CLIENTS' then
         lbClients.Items.CommaText := Msg;
     end;

и в какой то момент времени он не выходит из
Msg := IdTCPClient1.ReadLn('', 5);
в результате программка виснет намертво.

задача: прочитать из клентского сокета блок данных заранее неизвестной длины. кто что может присоветовать?


Polevi   (2004-02-16 18:20:00) [1]

TMyThread.Execute
var
c:TIdTcpClient;
Msg:string;
begin
c:=TIdTcpClient.Create(nil);
try
 try
  ...
  ...
  c.Connected:=true;
  while not Terminated and c.Connected do
  begin
   Msg := IdTCPClient1.ReadLn(..;    
   ...
   ...
  end;
 except
 end
finally
 c.Free;
end
end


DAnton   (2004-02-16 15:36:00) [2]

Аааэээээ.

Я конечно прошу Вашего прощения, за свою неопытность в задавании вопросов. Начинающий Я пока что. Ж-)

А в 3-х строка можешь описать как его выкинуть в отдельный поток?
Очень хоца что б работало.
Заранее благодарю.


Digitman   (2004-02-16 12:28:00) [3]


> Вот кто ЭТО может объяснить. тот настоящий дельфист?


а при чем здесь "дельфист" или "не дельфист", "настоящий" или "не настоящий" ?

есть WinAPI, есть WinsockAPI .. вызовы в их составе делятся на блокирующие и не блокирующие ... блокировка имеет смысл в контексте конкретного кодового потока ... что тебе еще объяснять ? ... убирай работу с Indy в доп.код.поток и будет тебе "счастье" - никаких антифризов и "форма мышу слушает" !


DAnton   (2004-02-16 12:11:00) [4]

Доброго времени суток всем.

Многое было сказано по этой теме, сам мучаюсь с этим примером и испытываю полное негодование.
Без Антифриза у меня вешается полностью прога.
С Антифризом, всё нормально (относительно), если не считать что мышу не слушает форма (не перетащить, ни в поле какое-либо перейти), а клава пашет стабильно.
Пробовал под всеми виндами.

Вот кто ЭТОможет объяснить. тот настоящий дельфист?
Ж-))))


Digitman   (2003-12-27 11:12:00) [5]

на кой шут такой таймаут нужен - 5 мсек ?

при пересчете в допустимые интервалы таймера такой таймаут превратится в INFINITE ! разрешение сист.таймера - платформозависимая величина ..

указывай таймаут не менее 50 - 60 мсек


Наверх

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