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