2014-11-20 2 views
0

Мое текущее приложение (A1) должно быть завершено, а также запустить другое приложение (A2). Но мне нужно запустить приложение A2 после полного завершения A1. Теперь у меня есть что-то вроде этого:Как дождаться завершения самого себя

begin 
    Application.Terminate; 
    wait(2000); <<<<<<< 
    ShellExecute(A2)... 
end; 

Чтобы быть более точным - мне нужно вызвать установки (A2) и хотите быть уверены, что A1 не работает, так как А2 является установка А1. Представьте себе, что окончание может длиться больше времени или оно показывает некоторый модальный диалог ...

Есть ли простой способ, как это сделать (дождаться его)? Конечно, без общения с A2 или смены A2! A2 может быть чем угодно еще в будущем.

Vladimír

ответ

3

нужно вызвать установки (A2) и хотите быть уверены, что A1 не работает.

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

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

1

Если вы хотите создать надлежащую программу установки/обновления, не беспокойтесь о том, когда и как ее выполнить, а вместо этого, как она обнаружит, работает ли ваше приложение или нет.

Теперь, если ваше основное приложение уже имеет механизм, чтобы предотвратить запуск нескольких экземпляров вашего приложения, у вас уже есть половина выполненной работы. Как?
Такие механики публикуют информацию о том, что экземпляр вашего приложения уже запущен, чтобы быть доступным другими программами.

Самая распространенная оценка для этого - зарегистрировать названный Mutex. Поэтому, когда запускается второй экземпляр вашего приложения, он обнаруживает, что он не может создать новый Mutex с тем же именем, поскольку он уже существует. Так что теперь в большинстве случаев второй экземпляр вашего приложения отправляет пользовательскому сообщению в первый экземпляр, чтобы перенести этот экземпляр на передний план (восстановить приложение), а затем закрывается.
Если вы хотите узнать больше о различных mechanizms, чтобы приободрить сколько экземпляров приложения могут быть запущены в то же время я предлагаю вам проверить следующую статью: http://delphi.about.com/od/windowsshellapi/l/aa100703a.htm

Так как же вы используете такой Механизм для инсталлятора/обновления?
Как и во втором экземпляре вашего приложения, чтобы проверить, не запущен ли еще один экземпляр, вместо этого вы проверяете это в своем установщике/обновлении. Вам даже не нужно делать эту проверку в начале программы установки/обновления. Вы можете сделать это еще позже (сначала загрузите файлы обновлений).
Если у вас есть экземпляр вашего приложения, вы передаете собственное сообщение. Но это сообщение отличается от того, которое один экземпляр отправит другому.
Теперь мы сообщим вашему приложению, что он будет обновлен, поэтому он должен начать процедуру закрытия.
Если вы формируете это настраиваемое сообщение таким образом, чтобы оно также содержало информацию о вашем приложении installer/updater application.handle, вы предоставляете себе возможность для вашего основного приложения отправлять ответ возврата, в котором он уведомляет установщик/обновление, в каком состоянии это.Для instnace:

  • asClosing (Основное применение только к закрытию)
  • asWaitinUserInput (основное приложение ждет пользователя, чтобы подтвердить, сохранить, например)
  • asProcessing (основное применение делает некоторые длительные обработки, так это в этот момент не может быть выключен)

И если в течение определенного времени ваш установщик не отвечает, ваш основной приложение может быть повесить, чтобы он уведомлял пользователя о невозможности автоматического закрытия основного приложения и поэтому использование r должен закрыть его вручную, а затем повторить процесс обновления.

Использование такого подхода позволит вам в любое время запустить ваш установщик/обновление в процессе выполнения основного приложения.
И не только это. Вы можете запустить программу установки/обновления, дважды щелкнув ее исполняемый файл, с помощью shourtcut, с помощью какого-либо другого приложения или даже с помощью системы задач Windows.

+0

.. при условии, что установщик может быть изменен ... или имеет такую ​​функциональность встроенного. –

+0

@SertacAkyuz Да, как мне грустно в первом ответе моего ответа, это полезно, если OP делает свою собственную программу прошивки для установщика/обновления для своего приложения. Но если OP ограничен с помощью стороннего установщика, он все равно может использовать это как механизм управления, который затем выполнит внешний установщик, когда основное приложение будет закрыто. – SilverWarior

+0

Спасибо! Только небольшая заметка. Я уже использую мьютекс в A1, а также в A2. Установка создана в InnoSetup и поддерживает мьютекс и работает правильно. Поэтому мой вопрос был более распространенным. –

Смежные вопросы