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

Вниз

CreateProcess - странная пауза при ожидании   Найти похожие ветки 

 
VaS   (2003-09-05 09:07) [0]

Запускаю GUI-приложение (инсталляцию, созданную Wise) с помощью CreateProcess() и жду завершения (WaitForSingleObject()). Программа выполняется нормально, но при ее (вызванной программы) закрытии интерфейс замораживается секунд на 10. После чего GetExitCodeProcess() возвращает 0. Собственно, непонятно - чего мы ждем? Запуск той программы отдельно никаких пауз при закрытии не вызывает. Замена WaitForSingleObject() на MsgWaitForMultipleObject() проблему не решает.

Вот код:


function CreateProcessAndWait(FullAppName, CurrDir, Params: string;
Visibility: integer; Wait: LongWord): integer;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
FResult: LongWord;
begin
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;

if not CreateProcess(nil,
PChar(FullAppName + " " + Params),
nil,
nil,
false,
{CREATE_NEW_CONSOLE or}
NORMAL_PRIORITY_CLASS,
nil,
PChar(CurrDir),
StartupInfo,
ProcessInfo) then
Result:=-1
else begin
if WaitforSingleObject(ProcessInfo.hProcess, Wait) = WAIT_OBJECT_0 then
GetExitCodeProcess(ProcessInfo.hProcess, FResult)
else
FResult := 0;
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
Result:=FResult;
end;
end;

CreateProcessAndWait(InstallFile, InstallsDir, "/s", SW_SHOWNORMAL, INFINITE);


 
Reindeer Moss Eater ©   (2003-09-05 09:17) [1]

Замена WaitForSingleObject() на MsgWaitForMultipleObject() проблему не решает.

А должна была решить по твоему?


 
VaS   (2003-09-05 09:24) [2]

Хм. Была мысль, что вызванная программа посылает сообщение вызвавшей SendMessage() и получаем deadlock. Хотя маловероятно, как и оказалось.


 
Reindeer Moss Eater ©   (2003-09-05 09:34) [3]

Посылать то может и посылает, но их никто не обрабатывает после вызова WaitforSingleObject


 
VaS   (2003-09-05 09:45) [4]

Ну ок. Верю :) Но все же вопрос остается открытым.


 
Reindeer Moss Eater ©   (2003-09-05 09:55) [5]

Какой вопрос-то?


 
Verg ©   (2003-09-05 09:55) [6]


> интерфейс замораживается


Чей интерфейс? Твоей проги или той, которую запускаешь?


 
Verg ©   (2003-09-05 09:58) [7]

но при ее (вызванной программы) закрытии

Кроме того, от момента исчезновения главного окна вызываемой программы, до приведения Handla процесса его породившего во взведенное состояние может пройти значительное время - происходят всякие детачпроцесс в дллельках и проч.


 
Digitman ©   (2003-09-05 10:02) [8]


> но при ее (вызванной программы) закрытии


именно при закрытии ? или в ходе исполнения ?

ты хочешь сказать, что в ходе исполнения интерфейс не "замораживается", только - в ходе "закрытия" ?
при WaitForSingleObject(), вызванному в основном потоке вызывающего процесса - не верю этому ! С момента вызова CreateProcess() и до момента возврата из WaitForSingleObject(), что бы и как бы не происходило в стартованном процессе, интерфейс вызывающего процесса будет "мертв" ! ибо вместо того чтобы обрабатывать сообщения от устройств ввода/вывода, осн.код.поток процесса блокирован ожиданием срабатывания объекта синхронизации.


 
VaS   (2003-09-05 10:08) [9]

Обеих.


 
VaS   (2003-09-05 10:21) [10]

Digitman: Сразу после старта дочернего процесса интерфейс вызвавшего, конечно, не обновляется. Но вызванная программа работает нормально (стандартный процесс инсталляции). Доходим в мастере инсталляции до последнего шага с кнопкой "Завершить". Жмем кнопку. Вот тут и перестает обновляться окно инсталлятора. Причем проблема именно с этим инсталлятором - раньше никаких проблем с этой моей функцией (CreateProcessAndWait) не было - вызывал много разных программ.
Т.е. явно этот инсталлятор при своем завершении делает нечто (или ожидает чего-то), чему мешает то, КАК я вызываю CreateProcess(). Т.е. мне кажется, что дело или в StartupInfo или во Flags.


 
Reindeer Moss Eater ©   (2003-09-05 10:22) [11]

Выдержка из документации:

If a thread creates any windows, it must process messages.

Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForSingleObject.


 
VaS   (2003-09-05 10:41) [12]

Новости с фронта :)

Сразу после запуска инсталлятора подключил к нему отладчик Делфи (attach to process). Отладчик остановился в окне cpu, жму F9. Перехожу к окну инсталлятора, завершаю инсталляцию и мгновенно выхожу из него после последнего шага (чего и добиваемся). Прекрасно, но никаких мыслей не возникло на тему "что стало причиной"?


 
Verg ©   (2003-09-05 10:49) [13]


> Reindeer Moss Eater © (05.09.03 10:22) [11]


Дык он же не Window создал а процесс.


> VaS (05.09.03 10:41) [12]


Тады не знаю, у меня подобных проблем не возникало.


 
Reindeer Moss Eater ©   (2003-09-05 10:54) [14]

Дык он же не Window создал а процесс.

Кроме процесса инсталятора поток имеет окна (главное приложение GUI). Этот поток (в нашем случае главный) обязан обрабатывать сообщения.


 
VaS   (2003-09-05 11:21) [15]


> Reindeer Moss Eater © (05.09.03 10:54) [14]


Безусловно, для обновления интерфейса (и не только) вызывающий процесс должен ждать с помощью ЬыпЦфшеАщкЫштпдуЩиоусе()б но проблема в моем случае совсем не в этом.


 
Digitman ©   (2003-09-05 11:29) [16]


> VaS


а не возникало у тебя мысли в целях отладки вести какой-то протокол работы приложения-инсталлятора ? ведь это же, насколько я понимаю, твое приложение, не "чужое" ?

ну, скажем, записывать в лог-файл инф-цию о времени начала и конца каких-то подозрительных (с т.з. "зависания" на длит.время) операций ?


 
guest   (2003-09-13 15:07) [17]

Debug it и не мучся :)



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

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

Наверх




Память: 0.51 MB
Время: 0.022 c
1-41160
Stratos
2003-11-01 02:48
2003.11.13
битовые поля в записях


14-41998
Song
2003-10-24 11:50
2003.11.13
Invalid System Disk, Insert Disk and Hit Enter


4-42272
Olfi
2003-09-11 23:43
2003.11.13
раскладка клавиатуры


1-41233
imp
2003-11-01 12:18
2003.11.13
Автоматизация тестирования проги


1-41281
sagchat
2003-10-31 13:41
2003.11.13
Как поменять символы в обратном порядке?