【发布时间】:2015-02-18 13:55:21
【问题描述】:
我是新手,很抱歉,如果我的问题看起来很愚蠢,我正在编写一个 Delphi 程序,在该程序中,我通过队列中的多个线程运行外部可执行文件列表并等待它们完成使用 CreateProcess 之类的:
CreateProcess(Pchar(NotepadExe), Nil, Nil, Nil,
False, NORMAL_PRIORITY_CLASS,
Nil, Nil, StartupInfo,ProcessInfo),
和
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
现在我调用的程序正在执行冗长的工作,所以如果我的程序在外部可执行文件仍在运行时关闭,是否有一种简单的方法可以重新获得对进程的访问并再次等待它们?还有一些已经完成的情况呢?
【问题讨论】:
-
这些流程是您开发的还是第三方程序?如果它们是由你开发的,你可以在它们中实现代码,让它们中的每一个去注册自己的互斥体,然后你可以检查它的存在。
-
关闭时记下子进程和您的进程的 ID。再次运行时,搜索父 pid 等于您之前的 pid 的子进程 pid 打开同步句柄并等待。从理论上讲,可能会遇到具有相同关系但应用程序不同的相同 pid。实际上,可以忽略不计。
-
请参阅this question 了解从 Delphi 枚举正在运行的进程的一种方法。
-
如果您的程序为每个子进程调用
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);,那么在每个子进程完成之前它究竟是如何“干净地”关闭的?