![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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) завершается некорректно. Т.е. поток не уничтожается.