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

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

TIdTCPServer [D7, WinXP]


Ozone ©   (2004-04-15 12:52:00) 

При закрытии сервера если были подключены клиенты - выдается сообщение "Termnate Thread timeout". Я так полагаю, что их (клиентов) нужно перед этим насильственно отрубать. Как это сделать?


Verg   (2004-04-15 14:53:00) [1]


> BlackTr   (15.04.04 14:45) [18]
> Так ведь вроде когда OnExecute заканчивается, поток все
> равно висит ???


Конечно. Только не висит, а снова вызывает OnExecute, если нет признаков разрыва соединения или остановки потока.


Ozone   (2004-04-15 14:51:00) [2]

TO BlackTr[18]

Да, но если клиенту нужно передать 5 картинок в сек, то имхо, по твоему это не удасться сделать - будет траться много времени на постоянно подключение.

Проще один раз подключиться и работать, работать, работать...


BlackTr   (2004-04-15 14:45:00) [3]

Так ведь вроде когда OnExecute заканчивается, поток все равно висит ???


Ozone   (2004-04-15 14:36:00) [4]

TO Verg ©[16]

Понятно. Будем думать.


Verg   (2004-04-15 14:32:00) [5]


> Ozone ©   (15.04.04 14:23) [14]
> Через CriticalSection.


Проблему я тебе объяснил - твой поток "застревает" в /*..*/

Где, как и почему, выяснять придется самому - кода нет, а если там еще и какая-нибудь "База данных", то там все что угодно может быть - может встать на блокировке записи, таблицы, на подключении к серверу и еще тысяча и одна причина....


Ozone   (2004-04-15 14:24:00) [6]

TO BlackTr[13]

Дык надо много принимать.


Ozone   (2004-04-15 14:23:00) [7]

To Verg ©[8]

> Я так понимаю, что через synchronize?

Через CriticalSection.


BlackTr   (2004-04-15 14:21:00) [8]

Так принял, сохранил, вывел на экран, и отрубил клиента :)


Ozone   (2004-04-15 14:20:00) [9]

TO BlackTr[11]

Он должен принимать картинки от клиентов, сохраниять их в БД и выводить на экран.


BlackTr   (2004-04-15 14:07:00) [10]

А что сервер должен делать ?
Вполне вероятно, что вам нужны не блокирующие сокеты.


Verg   (2004-04-15 14:04:00) [11]


> Ozone ©   (15.04.04 13:59) [9]
> TO Verg ©[8]
>
> Т.е. надо перед этим еще раз Terminate проверять?


При чем тут Terminate.
Я не вижу что и как делается в /*..*/.
Если бы клиентский поток просто висел на Connection.Readln или connection.ReadStream, то все было-бы ок. Если же он говорит, что таймаут завершения потока, значит твой поток висит где-то или чем-то своим занят, заглушив все Exception или не обращаясь к connection или.... да много каких "или" может быть.


Ozone   (2004-04-15 13:59:00) [12]

TO Verg ©[8]

Т.е. надо перед этим еще раз Terminate проверять?


Verg   (2004-04-15 13:54:00) [13]


> Ozone ©   (15.04.04 13:51) [7]
> TO Verg ©[5]
>
> Там принятая картинка сохраняется в БД и выводится на экран.


Я так понимаю, что через synchronize?

Если это происходит достаточно долго, либо с ожиданием чего-нибудь, то вполне вероятна "Termnate Thread timeout".


Ozone   (2004-04-15 13:51:00) [14]

TO Verg ©[5]

Там принятая картинка сохраняется в БД и выводится на экран.


Ozone   (2004-04-15 13:50:00) [15]

TO BlackTr[4]

И что? Он примет и отключит. Мне токого не надо....


Verg   (2004-04-15 13:49:00) [16]

Что происходит в /*..*/ ?


BlackTr   (2004-04-15 13:43:00) [17]

А если в OnExecute, в конце написать AThread.Connection.Disconnect; ?


Ozone   (2004-04-15 13:33:00) [18]

TO Verg[2]

if not AThread.Terminated and AThread.Connection.Connected then begin
try
  sType := AThread.Connection.ReadLn();
  size  := AThread.Connection.ReadLn();
  AThread.Connection.ReadStream(_file, StrToInt(size), false);
  /*..*/
 except
 end;
end;


Что не так? Может что-то забыл?

TO DevelS[1]

Спасибо, но не помогает.


Verg   (2004-04-15 13:04:00) [19]


> Ozone ©   (15.04.04 12:52)  
> При закрытии сервера если были подключены клиенты - выдается
> сообщение "Termnate Thread timeout". Я так полагаю, что
> их (клиентов) нужно перед этим насильственно отрубать. Как
> это сделать?


Значит в OnExecute что-то не то сделано.


DevelS   (2004-04-15 13:03:00) [20]

with TCPServer.ThreadMgr.ActiveThreads.LockList do
 try
   for I := 0 to Count - 1 do
   try
     TIdPeerThread(Items[I]).Connection.Disconnect();
   except
     TIdPeerThread(Items[I]).Stop;
   end;
 finally
   TCPServer.ThreadMgr.ActiveThreads.UnlockList;
 end;


Наверх

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