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

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

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


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

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


Цитата Serega:
Цитата South:
не очень понятно где это можно применить на практике, если только рассматривать этот вопрос как чисто академический »
При запуске распаковки архивов.
да вроде библиотек уже куча есть, хотя в данном случае не важно
Цитата:
Цитата South:
если вызвать ExecAndWait, то вызвавшая процедура/функция не завершится пока не завершится запущенное приложение.
а если после этого должны выполнится еще какие-то действия? »
Совершенно верно.
Видимо вы слабо знакомы с Inno Setup. Попробуйте запустить любую программу через Exec или ShellExec с параметром ожидания ewWaitUntilTerminated или запустить через [Run] и вы не сможите передвинуть окно инсталлятора.
про это я в курсе. кстати, если не лень, можете глянуть в исходники инно и посмотреть каким образом используется ewWaitUntilTerminated.
Цитата:
Цитата South:
сдается мне, что _ProcIsRunning вообще не в кассу, постоянно шмонать список процессов далеко не лучшее решение. »
Понятно, вы знакомы с программированием...
с программированием немного знаком
Цитата:
Самый простой вариант, это открыть файл через OpenProcess, если Handle > 0, то процесс работает...
может и простой, но работает дольше чем WaitForMultipleObjects,WaitForSingleObjects

Цитата:
Ну вообще-то, вы наверно заметили, что я сначала сверяю ID процесса, а затем его имя, т.е. чтоб определить, что это именно тот файл.
Не знаю, знаете вы или нет, но ID процесса в системе не уникален. После завершения этого процесса, его ID освобождается и при запуске другого процесса ему может быть присвоен системой точно такой же ID.
Так что проверка просто по ID, я счёл не совсем правильным и точным.
Ну а более простой способ узнать имя процесса через его ID, мне к сожалению не известен. Если вам известен более простой способ, то поделитесь, так сказать для само развития.
чтобы более наглядно было
Код: Выделить весь код
  TProcessInformation = record
    hProcess: THandle;
    hThread: THandle;
    dwProcessId: DWORD;
    dwThreadId: DWORD;
  end;
начнем с того, что я не предлагал использовать dwProcessId. я предложил использовать hProcess, который не будет освобожден, пока не вызван CloseHandle
Цитата:
Цитата South:
вообще для этих целей существует WaitForSingleObject »
Не согласен, инсталлятор, так же будет мёртвым, т.е. переместить вы его не сможете.
в общем случае да, будет мертвым, а если его использовать как я предложил, то должен ожить
Цитата:
Цитата South:
данные о запущенных процессах я бы заносил в массив »
и что дальше? Процесс закрылся, а с таким же ID, работает уже другой...
читаем выше, id не при чем
Цитата:
Цитата South:
по уму процедуру ожидания надо делать в отдельном потоке. в инно с этим проблемы, поэтому я бы запустил таймер (не очень хорошо, но на безрыбье ...), »
Совершенно с вами согласен, но стандартный Inno не поддерживает, не только многопоточность, он также не знает, что такое таймер (этот недостаток исправлен в версии от Restools). Если конечно не использовать дополнительных библиотек, а именно эту цель я и приследывал при написании данного скрипта, чтоб можно было использовать его без ничего.
да, пока не нажата кнопка 'install', приложение является однопоточным, только вот распаковку он может делать в несколько потоков. если по теме, то да, создавать потоки без привлечения самописных длл не получится. а про таймер, ваша религия позволила вам использовать системные библиотеки, так почему же не использовать SetTimer и KillTimer

Цитата:
Цитата South:
и была бы отдельная процедура прибития процессов при выходе из инсталла: прибили таймер и опять же пробежались по массиву и всем процессам TerminateProcess »
и прибили другой процесс...
Цитата South:
тогда и _Application_ProcessMessages не нужен »
да, если была бы возможность всё делать в отдельном потоке. »
не прибил бы, это все непонятки с PID'ом

Отправлено: 21:52, 21-01-2010 | #895