Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Новый участник


Сообщения: 29
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата Serega:
Прикрепил к сообщению скрипт, который позволяет запускать другие программы с ожиданием их завершения и при этом инсталлятор остаётся "живым", т.е. отвечает на действия пользователя.
Пример использования, подробно описан в скрипте. »
не очень понятно где это можно применить на практике, если только рассматривать этот вопрос как чисто академический

если вызвать ExecAndWait, то вызвавшая процедура/функция не завершится пока не завершится запущенное приложение.
а если после этого должны выполнится еще какие-то действия?

сдается мне, что _ProcIsRunning вообще не в кассу, постоянно шмонать список процессов далеко не лучшее решение. вообще для этих целей существует WaitForSingleObject

данные о запущенных процессах я бы заносил в массив
по уму процедуру ожидания надо делать в отдельном потоке. в инно с этим проблемы, поэтому я бы запустил таймер (не очень хорошо, но на безрыбье ...), а в нем прошелся бы циклом по массиву
Код: Выделить весь код
if WaitForSingleObject(PI.hProcess,200)<>WAIT_TIMEOUT then begin
  _CloseHandle(PI.hProcess);
  _CloseHandle(PI.hThread);
  ну и удаляем элемент массива, чтобы не отсвечивал
end;
и была бы отдельная процедура прибития процессов при выходе из инсталла: прибили таймер и опять же пробежались по массиву и всем процессам TerminateProcess. это можно сделать в том же OnCloseQuery

тогда и _Application_ProcessMessages не нужен

ну как-то так

ЗЫ в цикле от "if _QUIT then Break; " не будет толку. если процесс первый в списке, то ты из цикла "while _ProcIsRunning(ProcessName, ProcessID) do;" не выйдешь. в этом же случае не сработает _Application_ProcessMessages
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:34, 21-01-2010 | #885