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