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

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

Мое приложение не дает сделать перезагрузку системы


DelphiN! ©   (2007-06-13 16:14:00) 

в приложении используется ServerSocket, который видимо не дает моему приложению закрыться при запросе системы, из за этого перезагрузка, выключение или завершение текущего сеанса не происходит.
Отлавливаю системные события WM_QUERYENDSESSION и WM_ENDSESSION, обрабатываю их так :

 inherited;
 halt;


Однако при 1ой попытке перезагрузки системы моя программа завершается, но перезагрузки не происходит, если попробовать перезагрузить 2ой раз, то перезагрузка выполняется успешно ...

 Как выполнить перезагрузку с 1го раза?


Инс   (2007-06-22 14:33:00) [1]

Чисто из личного опыта... Была та же проблема, приложение не давало выйти из системы, так как че-то не то было в обработке WMQueryEndSession. Что я там только не писал, и Application.Terminate и Close - ниче не помогало. А дело оказалось вот в чем. У меня был сторонний компонент (руки поотрывать его разработчикам) который добавлял иконку в трей. Он создавал Message-only окошко с помощью AllocateHWnd. Так вот, в оконной функции этого окошка не стоял вызов Message.Result:=DefWindowProc (забыли или не посчитали нужным). При выходе из системы винда посылает сообщение WM_QueryEndSession всем окнам, и если хотя бы одно вернет 0, то завершения ситемы не происходит. Так и получалось без вызова Message.Result:=DefWindowProc. А обработка WMQueryEndSession у формы была ни причем.

Посмотрите, может у вас та же проблема...


DelphiN!   (2007-06-22 14:07:00) [2]


> Сергей М. ©   (15.06.07 08:27) [13]


1. ServerSocket.Active := false делаю при получении события WM_ENDSESSION, события WM_ENDSESSION. События WM_QUERYENDSESSION не получаю совсем.

2. Не организована реакция потоков на комманду термирования ....


procedure TfrmMain.ServerSocket1GetThread(Sender: TObject;
 ClientSocket: TServerClientWinSocket;
 var SocketThread: TServerClientThread);
begin
 SocketThread := TServerThread.Create(false, ClientSocket);
end;

procedure TServerThread.ClientExecute;
var
 SockStream : TWinSocketStream;
 FileInfo   : array [0..10000] of char;
 FileStream : TStream;
 BytesSent  : LongInt;
 nRead      : Integer;

 str,s,IP,stmp: String;
 strl,Params: TStringList;
 FS: TFileStream;
 n,i: Integer;
 bool: Boolean;
 OV: OleVariant;
 Point: TPoint;
begin
 try
   SockStream := TWinSocketStream.Create(ClientSocket,60000);
   if (SockStream.WaitForData(60000)) then
   begin
...


Сергей М.   (2007-06-15 10:07:00) [3]


> grisme ©   (15.06.07 08:41) [14]


Это тот же "Хальт ! Хенде хох !", только вид сбоку)


grisme   (2007-06-15 08:41:00) [4]

ExitProcess(0); не пробовал?


Сергей М.   (2007-06-15 08:27:00) [5]

1. При каком событии вы вызываешь ServerSocket.Active := False;
2. Как у тебя организована реакция потоков ServerSocket'а на команду терминирования ?


DelphiN!   (2007-06-15 07:49:00) [6]

И как с этим бороться?


DelphiN!   (2007-06-14 12:56:00) [7]

да, именно stThreadBlocking


Сергей М.   (2007-06-14 12:49:00) [8]

Режим у TServerSocket какой ? stThreadBlocking ?


DelphiN!   (2007-06-14 12:17:00) [9]


> Сергей М. ©   (14.06.07 11:34) [8]
>
> А событие OnCloseQuery у твоей формы возникает при завершении
> сессии ?


Нет, не возникает тоже! На форме находится компонент TServerSocket. Если его не заставлять слушать порт, то программа завершается корректо, если он слушает порт, то ни OnCloseQuery ни WM_QUERYENDSESSION не приходят при попытки перезагрузки. Приходит только сообщение WM_ENDSESSION, в обработчике которого я и писал вышеописаный код, который лишь термирует приложение, не давая системе завершиться


Сергей М.   (2007-06-14 11:34:00) [10]


> заметил что сообщение WM_QUERYENDSESSION моему окну не приходит


А событие OnCloseQuery у твоей формы возникает при завершении сессии ?


DelphiN!   (2007-06-14 09:45:00) [11]

Также заметил что сообщение WM_QUERYENDSESSION моему окну не приходит, только WM_ENDSESSION, почему не понятно!


DelphiN!   (2007-06-14 09:11:00) [12]

От
 inherited;
 Application.Terminate
 


и


inherited;
CClose := true;
frmMain.Close;


и


 Application.Terminate
 


и


CClose := true;
frmMain.Close;


эффект одинаковый - перезагрузка со 2ой попытки!


Сергей М.   (2007-06-13 16:51:00) [13]


> DelphiN! ©   (13.06.07 16:42) [4]


Ну а что за хальт ?)

Тебе чем Aplication.Terminate плох ? Или MainForm.Close ?


DelphiN!   (2007-06-13 16:42:00) [14]

Сергей М. ©   (13.06.07 16:40) [2]

Что за хендехох? :)


DelphiN!   (2007-06-13 16:41:00) [15]

Переделал так :


procedure TfrmMain.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
 inherited;
 CClose := true;
 Close;
end;

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 CanClose := CClose;
end;


Эффект тот же ... :(


Сергей М.   (2007-06-13 16:40:00) [16]


> Как выполнить перезагрузку с 1го раза?
>


После хальта сказать хендехох - без этого перезагрузка невозможна.


Romkin   (2007-06-13 16:30:00) [17]

Не делать halt а нормально делать выход из приложения.


Наверх

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