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

Вниз

Перезагрузка и Host- процесс   Найти похожие ветки 

 
qwerty2   (2003-06-10 12:33) [0]

Пользовательский модуль в виде DLL (некоторая форма) подключается к Host- процессу. При нажатии некоторой книпки на этой форме запускается процесс в отдельном потоке. Этот процесс при необходимости должен перезагрузить компьютер. Проблема в том, что когда он вызывает перезагрузку то Host- процесс не может завершиться из за того что не освобождены ресурсы занятые формой. Освободить форму из дополнительного потока также невозможно.


 
Digitman ©   (2003-06-10 12:39) [1]

Форма в DLL вызывается как модальная ?


 
qwerty2   (2003-06-10 12:49) [2]

да, модальная.


 
Digitman ©   (2003-06-10 12:54) [3]

что же мешает модальной форме реагировать на сист.сообщения WM_QUERYENDSESSION, WM_ENDSESSION ?

при получении хотя бы одного из таковых форма должна послать некое предопределенное сообщение (например, WM_QUIT) созданному ей код.потоку, который одновременно ожидает завершение стартованного им процесса (требующего перезагрузки), дождаться завершения этого потока и закрыться.

см. TThread.Terminate, PostThreadMessage(), MsgWaitForMultipleObjects()


 
qwerty2   (2003-06-10 16:08) [4]

>дождаться завершения этого потока

можно уточнить? чтоб узнать что поток завершен я посылаю в последней строчке OnTerminate этого потока некоторое сообщение и в основной программе жду этого сообщения с помощью MsgWaitForMultipleObjects (в процедуре обработки WM_ENDSESSION).
Теперь Host- процесс не выдает сообщение об ошибке при закрытии, а закрывается нормально но процесс перезагрузки при этом прекращается. И что то очень долгое получается ожидание завершения - секунд 20.


 
Digitman ©   (2003-06-10 16:18) [5]


> чтоб узнать что поток завершен


а с чего бы ему завершиться, потоку ? он же вроде бы у тебя ждет, пока не завершится процесс-перезагрузчик !

приведи-ка полный код твоего наследника TThread...


 
qwerty2   (2003-06-10 17:01) [6]

и еще хотелось бы спросить насчет MsgWaitForMultipleObjects, точнее ее последнего параметра. Windows предлагает мне небогатый выбор из QS_KEY,QS_MOUSEMOVE, QS_MOUSEBUTTON,QS_POSTMESSAGE,QS_TIMER,QS_PAINT,QS_SENDMESSAGE,QS_HOTKEY,QS_ALLPOSTMESSAGE. что же нужно использовать? если QS_POSTMESSAGE то MsgWaitForMultipleObjects будет просыпаться от любого сообщения в очереди? но мне то надо только реакция на мое сообщение. И еще не могу понять взаимодействие дополнительного потока и основного потока VCL. Сейчас делаю так: в OnTerminate:
postmessage(getcurrentprocess,wm_user,0,0);
в процедуре обработки WM_ENDSESSION:
hh:=getcurrentprocess;
msgwaitformultipleobjects(1,hh,false,INFINITE,qs_postmessage); так как и основной и дополнительный поток принадлежат одному и тому же процессу. мне кажется именно здесь что то делаю не так.


 
Digitman ©   (2003-06-10 17:13) [7]

приведи-ка полный код твоего наследника TThread !!


 
qwerty2   (2003-06-11 10:08) [8]

Сейчас у меня такая ситуация.
Перезагрузку инициирует сам дополнительный поток, дополнительного процесса порождаемого этим потоком нет.
в методе Execute:
begin
ff:=FObj.Create;
ff.MFind(FNmr);
synchronize(proc1);//дествия которые надо выполнить с результатами процедуры поиска - отображение их на форме
end;
//-в модуле где описывается объект FObj:
procedure FObj.MFind(Str:String);
begin
...
if {некоторое условие} then ExitWindowsEx(EWX_REBOOT,0);
...//некоторые дальнейшие действия

в обработчеке OnTerminate:
...
postmessage(getcurrentprocess,wm_quit,0,0); //последняя строчка
end;

procedure TForm1.EndSess(var mes:TMessage);//обработчик WM_ENDSESSION
var hh:THandle;
begin
if mes.WParam<>0 then begin
if not(thr1.Terminated) then thr1.Terminate;
hh:=getcurrentprocess;
msgwaitformultipleobjects(1,hh,false,INFINITE,qs_postmessage);
Form1.Free;
end;
end;




 
qwerty2   (2003-06-16 13:08) [9]

Все еще не устранена проблема. Почему то процес перезагрузки прерывается. Помогите пожалуста!


 
Digitman ©   (2003-06-16 13:55) [10]

ясно.
никакой процесс у тебя в потоке не "запускается" - вводишь ты людей в заблуждение.

procedure TForm1.EndSess(var mes:TMessage);//обработчик WM_ENDSESSION
begin
if mes.WParam<>0 then
begin
thr1.Free;
mes.Result := 0;
ModalResult := mrCancel;
end;
end;


 
qwerty2   (2003-06-16 15:00) [11]

//Digitman © (16.06.03 13:55)

странно, но происходит то же самое. исчезает панель задач, все программы благополучно закрываются кроме моей и ее Host-процесса. по прошествии очень длительного времени закрываются все таки и они. но вот перезагрузка не происходит. причем длительная задержка случается какраз при выполнении thr1.Free;


 
Digitman ©   (2003-06-16 15:13) [12]


> причем длительная задержка случается какраз при выполнении
> thr1.Free


а что это еще за "...//некоторые дальнейшие действия
" ? код.поток процесса инициировал шатдаун - и продолжает неторопливо "пыхтеть по хозяйству" ? Закругляться надо ему немедленно !

Это - хэлп. Читай сюда :

During a shutdown or log-off operation, applications that are shut down are allowed a specific amount of time to respond to the shutdown request. If the time expires, Windows displays a dialog box that allows the user to forcibly shut down the application, to retry the shutdown, or to cancel the shutdown request. If the EWX_FORCE value is specified, Windows always forces applications to close and does not display the dialog box.


 
Федя   (2003-06-16 15:55) [13]

Вся проблемма в
...//некоторые дальнейшие действия
у меня тоже такое было
тебе надо сделать так чтобы примерно так


Procedure Execute()
var reboot:boolean;
begin
while not Terminated do
begin
sleep(1); //без этого не советую
if reboot then continue
if <...> then
begin
ExitWindowsEx(EWX_REBOOT,0) then
reboot:=true;
continue;
end;
end


чтобы правильно завершить поток, когда система его попросит
а форма тут не причем



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

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

Наверх




Память: 0.5 MB
Время: 0.016 c
14-84569
Andrew.
2003-06-07 17:30
2003.06.26
SMTP и отправка писем из програмы.


6-84487
Kedis
2003-04-22 09:05
2003.06.26
Outlook Express


14-84606
Silentium!
2003-06-09 12:36
2003.06.26
Адресная книга


1-84150
Apach
2003-06-11 12:51
2003.06.26
Работа с Excel


3-83942
Niki
2003-06-03 13:27
2003.06.26
ADOTable - сортировка в обратном порядке?