Главная страница
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.019 c
2-1182603216
Loonar
2007-06-23 16:53
2007.07.15
Как нарисовать увеличивающийся круг


1-1178875351
VladkoRUS
2007-05-11 13:22
2007.07.15
LIBRARY под Kylix и FreePascal


2-1182348433
deras
2007-06-20 18:07
2007.07.15
В какое поле записать текущую дату и время?:


11-1165212425
ebz
2006-12-04 09:07
2007.07.15
override in KOL


15-1181700973
Slider007
2007-06-13 06:16
2007.07.15
С днем рождения ! 13 июня 2007 среда