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

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

IdTCPServer - Terminate Thread Timeout [D7]


BanderLog ©   (2005-05-19 13:35:00) 

Помогите разобраться. Использую комоненты Indy 9.
К серверу подключаются клиенты, после чего пытаюсь сделать Server.Active := False. В итоге выпадает вышеупомянутая ошибка. На сервере сделал процедуру:


procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
with Server.Threads.LockList do
 try
  Memo1.Lines.Add('Подключений: ' + IntToStr( Count));
  for i := Count-1 downto 0 do
   begin
    Memo1.Lines.Add('');
    Memo1.Lines.Add('Подключение №' + IntToStr( i));
    Memo1.Lines.Add(' имя - ' + TIdPeerThread(Server.Threads.LockList[i]).Connection.LocalName);
   end;
 finally
   Server.Threads.UnlockList;
 end;
end;


По нажатию показывает сколько коннектов к серверу, но если у меня было, допустим 3 коннекта, и один из клиентов отключился, данная порцедура все равно показыват 3 коннекта. И при попытке закрыть программу опять таже ошибка. :(
Подскажите почему так происходит и как с этим бороться....


KorvinOE   (2005-06-01 22:49:00) [1]

Да всё с той же перепуги, что TimeOut не пашет


Eraser   (2005-06-01 21:40:00) [2]

KorvinOE ©   (01.06.05 21:17) [6]

Так с какого перепугы ты ставил TerminateWaitTime = 1 миллисекунде? Естественно ошибка будет... никакое соединение не установится за 1 мс. Поставь хотя бы 500-1000.


KorvinOE   (2005-06-01 21:17:00) [3]

Я заметил эту ошибку и у себя. Я никак не могу справиться с TimeOut при приёме сообщения и пробывал выставить у TIdTCPServer свойство TerminateWaitTime. Оно по умолчанию равно 5000. Я его поставил равным 1 и у меня появилась эта ошибка и не помогали никакие try. Но когда вернул значение назад то ошибка больше не появляется.


Eraser   (2005-05-28 17:53:00) [4]

KorvinOE   (28.05.05 14:02) [4]

Немного не так надо.
Метод Disconnect тоже необходимо выполнять в защищённой секции:

try
 Disconnect;
except
end;


KorvinOE   (2005-05-28 14:02:00) [5]

Попробу так:

procedure TForm1.IdTCPServerExecute(AThread: TIdPeerThread);
begin
with AThread.Connection do
  try
   {
     Твои команды ...
   }
  finally
   Disconnect;
  end;
end;


Eraser   (2005-05-20 13:50:00) [6]

BanderLog   (20.05.05 07:04) [2]

В ервую очередь "загнать" все потенциально опасные участки кода в OnExecute в секции try...except(finally) и при возникновении ошибки немедленно ставить флаг Terminated у текущего потока.


BanderLog   (2005-05-20 07:04:00) [7]

Тогда как заставить его завершить нормально? Так что бы поток уничтожился.... :(


Eraser   (2005-05-19 14:35:00) [8]

BanderLog   (19.05.05 13:35)

Ошибка в том, что коннект (событие OnExecute) завершается некорректно. Т.е. поток не уничтожается.


Наверх

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