Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизПерезагрузка и 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.026 c