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

Вниз

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

 
DelphiN! ©   (2007-06-13 16:14) [0]

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

 inherited;
 halt;


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

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


 
Romkin ©   (2007-06-13 16:30) [1]

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


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


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


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


 
DelphiN! ©   (2007-06-13 16:41) [3]

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


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

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


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


 
DelphiN! ©   (2007-06-13 16:42) [4]

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

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


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


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


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

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


 
DelphiN! ©   (2007-06-14 09:11) [6]

От
 inherited;
 Application.Terminate
 


и


inherited;
CClose := true;
frmMain.Close;


и


 Application.Terminate
 


и


CClose := true;
frmMain.Close;


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


 
DelphiN! ©   (2007-06-14 09:45) [7]

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


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


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


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


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


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


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


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

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


 
DelphiN! ©   (2007-06-14 12:56) [11]

да, именно stThreadBlocking


 
DelphiN! ©   (2007-06-15 07:49) [12]

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


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

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


 
grisme ©   (2007-06-15 08:41) [14]

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


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


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


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


 
DelphiN! ©   (2007-06-22 14:07) [16]


> Сергей М. ©   (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-22 14:33) [17]

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

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



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

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

Наверх




Память: 0.51 MB
Время: 0.015 c
2-1182084780
skan
2007-06-17 16:53
2007.07.15
Фильтрация


3-1175764351
DeadMeat
2007-04-05 13:12
2007.07.15
Компоненты для доступа к БД


2-1182598841
>>DEATH<<
2007-06-23 15:40
2007.07.15
плавающие окна


2-1182106911
Dmitryfox
2007-06-17 23:01
2007.07.15
Как изменить дату фотографии ?


2-1180979197
к2в2
2007-06-04 21:46
2007.07.15
Определение учетной записи