Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.06;
Скачать: CL | DM;

Вниз

Виснет при TidServerSocket.Active:=false; Инди 10   Найти похожие ветки 

 
Kacnep ©   (2006-03-22 16:31) [0]

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


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 Как Все подключеным клиентам отправить Закрытие сокета.

Спасибо!


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


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


Сомневаюсь.

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


 
Eraser ©   (2006-03-22 16:58) [2]


> Kacnep ©   (22.03.06 16:31)

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


 
Kacnep ©   (2006-03-22 17:23) [3]

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;


 
Kacnep ©   (2006-03-22 17:26) [4]

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

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


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


 
Kacnep ©   (2006-03-23 09:03) [5]

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


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


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


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

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


 
Kacnep ©   (2006-03-23 10:06) [7]

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


 
Kacnep ©   (2006-03-23 10:11) [8]

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


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


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


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

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


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


Да.

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


 
Kacnep ©   (2006-03-23 12:39) [10]

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



Страницы: 1 вся ветка

Текущий архив: 2006.08.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
8-1139576813
DelphiLexx
2006-02-10 16:06
2006.08.06
Моделирование и Delphi


3-1148978355
МЕГАватт
2006-05-30 12:39
2006.08.06
Изменить представление данных в DBGrid


15-1150462592
blackcrazzy
2006-06-16 16:56
2006.08.06
Сайт Delphimaster.ru


15-1151928395
СБСОФТ
2006-07-03 16:06
2006.08.06
СБСОФТ: Вакансии (программист Delphi Firebird)


2-1153299112
Crazy monkey
2006-07-19 12:51
2006.08.06
Учет пользователей