Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-41915
icebeerg
2003-10-21 13:30
2003.11.13
О списании


3-40813
Брат
2003-10-21 19:17
2003.11.13
SQL


6-41852
SEvgeniy
2003-09-05 18:27
2003.11.13
ограничение трафика


7-42213
Shakula
2003-09-04 15:44
2003.11.13
Как определить адрес порта по названию.


7-42167
short
2003-08-28 21:44
2003.11.13
Sound card (in-out)





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