Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];
ВнизМое приложение не дает сделать перезагрузку системы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.049 c