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

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

Виснет при TidServerSocket.Active:=false; Инди 10 [D6, Win2k, WinXP]


Kacnep ©   (2006-03-22 16:31:00) 

Доброе время суток всем!
Уважаемые мастера, не скажете в чем может быть трабл.
После прекращения Трида выполняется код основной программы


procedure Tf_Main.CS_Done(Sender: TObject);
begin
//  !!!!!!!!!!!!!!!!!!!!!!!!!!!! Трид долго закрывается но закрывается (сек 30 примерно в потоке)
 if Assigned(CSCl) then begin
   AddLog('***** CS ***** : Nil(CSCl);',LogF);
   CSCl:=nil;
   sb_Main.Panels[4].Text:='CSThread закрыта! Закрываю Server...';
   Application.ProcessMessages;

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! То что ниже вообще не выполняется - так и не дождался закрытия!!!!!!!!
   if id_Srv.Active then id_Srv.Active:=false;

   sb_Main.Panels[4].Text:='Server Закрыт!';

   if not id_Srv.Active then begin
     bb_Start_Srv.Enabled:=true;
     gb_Srv.Enabled:=true;
     sb_Main.Panels[3].Text:='Читеров: 0';
     sb_Main.Panels[4].Text:='Сокет закрыт.';
   end
 end;//if
end;


Что происходит????? Если клиент ТСП активен то закрыть его! Даже при 0 подключений к нему - все! Висяк!

Вопрос 2 Как Все подключеным клиентам отправить Закрытие сокета.

Спасибо!


Kacnep   (2006-03-23 12:39:00) [1]

Сергей можно ли связаться с Вами по аське?
Если можно - 70015922.


Сергей М.   (2006-03-23 10:17:00) [2]


> у  id_Srv: TIdTCPServer; - нет свойства ReceiveTimeout


Ну пусть не ReceiveTimeout ..

Пусть это будет TIdTCPConnection.ReadTimeout (в Indy9, в 10-ке - не знаю) - какая разница ? Можно было бы и самому уж догадаться, что речь идет о некоем св-ве, задающем тайм-аут ..


> где проверять завершился ли поток?
> Я так понимаю  в методе id_SrvExecute?


Да.

А по поводу "примеров" - они есть в составе Indy Demo Projects


Kacnep   (2006-03-23 10:11:00) [3]

Сергей можно ли связаться с Вами по аське?
Если можно - 70015922.


Kacnep   (2006-03-23 10:06:00) [4]

2 Сергей
Я почти уверен что ты прав!
Ибо когда клиентов нет сервак гаситься моментом!
Но у  id_Srv: TIdTCPServer; - нет свойства ReceiveTimeout :(
И где проверять завершился ли поток?
Я так понимаю  в методе id_SrvExecute?
А что нить похожее на Пример у Вас можно спросить?


Сергей М.   (2006-03-23 09:51:00) [5]


> Kacnep ©   (23.03.06 09:03) [5]


Сервер у тебя зависает из-за того что не может дождаться завершения как минимум одного из созданных им кодовых потоков. А поток этот тем временем занят бесконечным ожиданием данных в вызванной им ф-ции ReadLn().

Установи для сервера св-во ReceiveTimeout порядка секунды-двух, тогда ф-ция по истечению тайм-аута будет возвращать управление, после чего следует тут же проверить св-во Terminated потока, и если оно установлено - немедленно закругляться.


Kacnep   (2006-03-23 09:03:00) [6]

Ув. Мастера
сервер реально зависает на такой фразе id_Srv.Active:=false;
Может ли кто нить подсказать как отключить все подключения?
А уж потом попытаюсь сделать Деактивацию сервера.
Спасибо


Kacnep   (2006-03-22 17:26:00) [7]

И еще Мастера подскажите тупню как в инди реализовать что то типа такой инструкции.

For i:=0 to TCPServer.Conections.count do
 TCPServer.Conections[i].socket.close;


на всякий пожарный хочу перед закрытием сервера порвать все подключения


Kacnep   (2006-03-22 17:23:00) [8]

2 Eraser
Я эту процедуру повесил на завершение потока.
Поток начинает работу с такими параметрами
 FreeOnTerminate := True;
 i_uc:=TIdUDPClient.Create(nil);
 i_uc.ReceiveTimeout:=2000;
 i_uc.Host:=FSRV;
 i_uc.Port:=FPort;
Это на всяк пожарн... в потоке УДП клиент работает с КС сервером.
Когда я ему приказываю завершиться - он нормально завершается ()в логах все последовательно видно-даже понял почему долго -30 сек.)
 И как только он завершается вызывается CS_Done.

2 Сергей М.
ОнЭкзекуте - приходит "Byte Строка"
byte - всегда равен 2 - по логам смотрю...
А строка это как комманда Выход,Чистый,Читер
Все...
тут не должно быть место ошибке...

procedure Tf_Main.id_SrvExecute(AContext: TIdContext);
var
 s:string;
 n:integer;
begin
 s:=AContext.Connection.IOHandler.ReadLn;
 Addlog(AContext.Connection.Socket.Binding.PeerIP+' - '+s,Logf);
 case strtoint(s[1]) of
   1 : begin //clear
//      if copy(s,3,length(s)-2)='Quit...' then
 //      Addlog(AContext.Connection.Socket.Binding.PeerIP+' прислал QUIT из-за версии.',Logf);
   end;//2
   2 : begin
     n:=GetPos(AContext.Connection.Socket.Binding.PeerIP);
     if copy(s,3,length(s)-2)='Clear.' then begin
       Addlog(AContext.Connection.Socket.Binding.PeerIP+' - '+s,Logf);
       if n<0 then lb_Users.Items.AddObject(AContext.Connection.Socket.Binding.PeerIP+' OK',Pointer(1))
       else begin
         lb_Users.Items.Strings[n]:=AContext.Connection.Socket.Binding.PeerIP+' OK';
         lb_Users.Items.Objects[n]:=Pointer(1);
       end;//else
     end
     else
       if copy(s,3,length(s)-2)='Quit' then begin
         Addlog(AContext.Connection.Socket.Binding.PeerIP+' прислал QUIT. Отключается.',Logf);
         if n>=0 then lb_Users.Items.Delete(n);
         AContext.Connection.Socket.CloseGracefully;
       end
       else begin
         Addlog(AContext.Connection.Socket.Binding.PeerIP+' - '+s,Logf);
         if n<0 then lb_Users.Items.AddObject(AContext.Connection.Socket.Binding.PeerIP+' Чит',Pointer(2))
         else  begin
           lb_Users.Items.Strings[n]:=AContext.Connection.Socket.Binding.PeerIP+' Чит';
           lb_Users.Items.Objects[n]:=Pointer(2);
         end;//else
       end;
   end;//2
 end;//case
end;


Eraser   (2006-03-22 16:58:00) [9]


> Kacnep ©   (22.03.06 16:31)

кем вызывается procedure Tf_Main.CS_Done(Sender: TObject); ?


Сергей М.   (2006-03-22 16:54:00) [10]


> Даже при 0 подключений к нему - все!


Сомневаюсь.

При >0 - да, ситуация действительно возможна из-за неверной логики, реализованной , скажем, в OnExecute


Наверх

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