如何等待自己终止

时间:2014-11-20 15:17:02

标签: delphi

我当前正在运行的应用程序(A1)需要终止,但还需要运行其他应用程序(A2)。但我需要在A1完全终止后运行应用程序A2。现在我有这样的事情:

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

更确切地说 - 我需要调用安装(A2)并确保A1没有运行,因为A2是A1的安装。请想象终止可以持续更长时间,或者它显示一些模态对话......

有什么简单的方法可以做到(等待它)?当然没有与A2交流或改变! A2可能是未来的任何其他东西。

弗拉迪米尔·

2 个答案:

答案 0 :(得分:3)

  

我需要调用安装(A2)并希望确保A1没有运行。

这是不可能的。您无法在已终止的进程中执行代码。一旦进程终止,就没有任何东西可以执行代码。

您需要一个新流程。启动新进程的唯一任务是等待其父进程终止,然后在父进程终止后执行任何操作。

答案 1 :(得分:1)

如果想要制作一个合适的安装程序/更新程序,不要担心何时以及如何执行它,而是如何检测应用程序是否正在运行。

现在,如果您的主应用程序已经有一个机制来防止启动应用程序的多个实例,那么您已经完成了一半的工作。怎么样?
此类机制会发布有关已运行的应用程序实例的信息,以供其他程序使用。

最常见的appraoch是注册一个名为Mutex的。因此,当您的应用程序的第二个实例启动时,它会发现它无法创建具有相同名称的新互斥锁,因为已存在一个。因此,现在大多数情况下,应用程序的第二个实例会向第一个实例发送自定义消息,以将该实例置于前端(还原应用程序),然后自行关闭。 如果您想了解更多有关不同机制的信息,以便同时控制应用程序的运行实例数,我建议您查看下一篇文章: http://delphi.about.com/od/windowsshellapi/l/aa100703a.htm

那么如何将这种机制用于安装程序/更新程序?
就像检查应用程序的第二个实例以查看是否已经运行另一个实例一样,请在安装程序/更新程序中进行检查。您甚至不需要在安装程序/更新程序的开头执行此方案。您甚至可以在以后执行此操作(首先下载更新文件) 如果您的应用程序正在运行,则会广播自定义消息。但是这个消息与一个实例发送给另一个实例的消息不同 现在,这将告诉您的应用程序即将更新,以便它应该开始关闭程序 如果您以这样的方式形成此自定义消息,它还包含有关安装程序/更新程序application.handle的信息,您可以让自己的主应用程序发送返回响应,在该响应中它通知安装程序/更新程序它处于哪种状态。对于instnace:

  • asClosing(主要应用即将关闭)
  • asWaitinUserInput(主应用程序正在等待用户确认保存例如)
  • asProcessing(主要应用程序正在进行一些冗长的处理,因此此时无法关闭)

如果在一定时间内没有响应,安装程序可能会认为您的主应用程序可能已挂起,因此会通知用户主应用程序的自动关闭已失败,因此用户应手动关闭它然后重试更新过程。

使用此方法可以在执行主应用程序时随时启动安装程序/更新程序 不仅如此。您可以通过双击其可执行文件,shourtcut,某些其他应用程序甚至Windows任务系统来启动安装程序/更新程序。