Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
1-84209
???
2003-06-12 19:24
2003.06.26
Можно ли узнать в развёрнутом ли состоянии TComboBox или нет?


6-84478
xman
2003-04-15 14:40
2003.06.26
Сеть+аудио


14-84669
Jurd
2003-06-08 17:03
2003.06.26
Где взять компоненту?


3-84002
AlexBut
2003-05-29 06:39
2003.06.26
Код ошибки Jet


3-83909
Ann
2003-06-03 10:55
2003.06.26
Error





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский