如何检测一个进程是不是已经执行完毕

Posted

技术标签:

【中文标题】如何检测一个进程是不是已经执行完毕【英文标题】:How to detect whether a process has completed execution如何检测一个进程是否已经执行完毕 【发布时间】:2012-01-11 20:35:18 【问题描述】:

这是场景:- 我有两个应用程序 - 一个是 C#,另一个是 VC++。 用 C# 编写的一个是主应用程序,在 button click 上创建了 VC++ 应用程序在 C# 应用程序的 panel 内运行。它运行成功。但是我如何检测 VC++ 应用程序是否已完成执行。虽然我能够看到它已经完成执行,但是当我尝试使用processname.HasExited 技术来合并一些其他任务以在 VC++ 进程完成时执行时,我无法这样做。甚至processname.Exited += new EventHandler(processname_Exited); 似乎也不起作用。 无论如何能告诉我如何解决这个问题吗?

谢谢。

EDIT#1:processname 是一个System.Diagnostic.Process 对象。

【问题讨论】:

文档说“只有当 EnableRaisingEvents 属性的值为 true 时才会发生此事件。”您是否记得将EnableRaisingEvents 设置为true? P.S.,如果你提到 processname 是一个 System.Diagnostic.Process 对象,那将有很大帮助。我不得不去搜索弄清楚你在说什么。 @RaymondChen 是的,它是一个System.Diagnostic.Process 对象。对不起,我忘了提这个。是的,我已将EnableRaisingEvents 属性的值设置为true。但它仍然无法正常工作。 听起来那个项目并没有真正退出。与任务管理器核对一下:它还在徘徊吗? 【参考方案1】:

我建议您通过在 VC++ 应用程序中的 WM_QUIT 事件时使用 PostMessage() API 发送自定义消息,将客户端应用程序(此处为 VC++ 应用程序)的“退出”传达给父应用程序(此处为 C# 应用程序)。我不确定如何在 C# 父应用程序中接收此消息。

【讨论】:

以上是关于如何检测一个进程是不是已经执行完毕的主要内容,如果未能解决你的问题,请参考以下文章

1-3 join方法

多线程《三》join方法

Process join方法 以及其他属性

03process对象的其他方法属性

编发编程(Process对象的join方法)

Process对象的其它方法与属性(join)