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