Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1182517334
harisma
2007-06-22 17:02
2007.07.15
В чем разница?


15-1180086845
TUser
2007-05-25 13:54
2007.07.15
220 шагов


4-1170879879
Vemer
2007-02-07 23:24
2007.07.15
Как сменить цвет фонта ?


15-1181579172
Тохер
2007-06-11 20:26
2007.07.15
Возможно ли определить четкость фото?


15-1181904165
Piter
2007-06-15 14:42
2007.07.15
Мощность мотоциклов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский