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

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

Закрытие проги - инди сервер виснет. [D6, Win2k, WinXP]


Kacnep ©   (2006-07-24 11:10:00) 

Д6, Инди 10, IdCmdTCPServer.
Программа не может прекратить вою работу - только если придет комманда SHUTDOWN  от клиента.
1. Запускается любая программа, а затем уже
2. ЗАКРЫВАЕТСЯ ИНДИ СЕРВЕР
3. Программа завершет свою работу

Внимание! По приходу команды Шатдаун  - сервер сразу отключает клиента (у команды св-во Disconnected:=True)

Вот небольшой кусок кода с коментариями
procedure Tf_Main.id_SrvCommandHandlers0Command(ASender: TIdCommand);
var
 scr:array[0..800] of char;
begin
 //если пришедшая команда от IP пользователя который в списке то
 if (lb_IPs.Count>0) and (lb_IPs.Items.IndexOf(ASender.Context.Connection.Socket.Binding.PeerIP)>-1) then begin
   le_Script.Text:=trim(le_Script.Text)+' ';
   le_Script.Text:=trim(copy(le_Script.Text,1,pos(' ',le_Script.Text)));
   StrPCopy(scr,le_Script.Text);
 //запускаем нужную нам программу и забываем про нее
   ShellExecute(Application.Handle,'open',scr,nil,nil,SW_ShowNormal);
//устанавливаем ТАГ в 1 (он нам пригодиться далее)
   Tag:=1;
// говорим закрыть программу
   f_Main.Close;
 end;//if
end;


Клозе вызывает

procedure Tf_Main.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
 i:integer;
begin
 CanClose:=f_Main.Tag=1; //никогда нельзя закрыть прогу только если ТАГ сменился на 1 а это происходит по приходу команды шатдун - выше процедура
 if not CanClose then begin //если просто пользователь нажал ЗАКРЫТЬ прогу то
   cti_Main.HideMainForm; // сворачиваем в трей
 end
 else begin //если пришла команда  ШАТДАУН то должны выгрузить прогу
   if id_Srv.Active then // если сервер инди активен то
     if StopServer then begin //останавливам сервер (следующая процедура)
       Application.Terminate; //вроде как
     end //begin
     else begin //какая то ошибка при закрытии ИНДИ сервера
       ShowMessage('Error stopping server.');
       CanClose:=false;
     end;
 end;
end;


Ну и теперь что собственно приостановке сервера происходит

function Tf_Main.StopServer: Boolean;
begin
 id_Srv.Active:=false;
// id_Srv.Bindings.Clear; // вот это я вообще ТУПо взял из примера и не знаю надо - нет?
 Result:=not id_Srv.Active;
 if result then begin
   sb_Main.SimpleText:='Server stopped';
 end
 else begin
   sb_Main.SimpleText:='Server running';
 end;
end;


Все...
Итак по приходу команды Шатдаун - из первой процедуры ShellExecute выполняется и программа вроде должна завершить свою работу закрыв сервер - но этого не происходит :(
Может кто нить что нить подсказать?
Спасибо.


Kacnep   (2006-07-24 11:51:00) [1]

function Tf_Main.StopServer: Boolean;
begin
id_Srv.Active:=false;
---  сразу после этой команды код не выполняется! и программа не завершает свою работу :((


Наверх

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