Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateProcess - странная пауза при ожидании [D6, WinXP]


VaS ©   (2003-09-05 09:07:00) 

Запускаю 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);


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

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


Digitman   (2003-09-05 11:29:00) [2]


> VaS


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

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


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


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


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


Reindeer Moss Eater   (2003-09-05 10:54:00) [4]

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

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


Verg   (2003-09-05 10:49:00) [5]


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


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


> VaS (05.09.03 10:41) [12]


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


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

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

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


Reindeer Moss Eater   (2003-09-05 10:22:00) [7]

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

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:21:00) [8]

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


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

Обеих.


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


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


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

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


Verg   (2003-09-05 09:58:00) [11]

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

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


Verg   (2003-09-05 09:55:00) [12]


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


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


Reindeer Moss Eater   (2003-09-05 09:55:00) [13]

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


VaS   (2003-09-05 09:45:00) [14]

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


Reindeer Moss Eater   (2003-09-05 09:34:00) [15]

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


VaS   (2003-09-05 09:24:00) [16]

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо