我是新手,所以很抱歉,如果我的问题看起来很愚蠢,我正在写一个Delphi程序,其中我通过队列中的多个线程运行外部可执行文件列表并等待他们完成使用CreateProcess,如:
CreateProcess(Pchar(NotepadExe), Nil, Nil, Nil,
False, NORMAL_PRIORITY_CLASS,
Nil, Nil, StartupInfo,ProcessInfo),
和
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
现在我调用的程序正在执行冗长的工作,所以如果我的程序在外部可执行文件仍在运行时关闭,是否有一种简单的方法可以重新获得对进程的访问并再次等待它们?那些已经完成的情况呢?
答案 0 :(得分:1)
我做了@SertacAkyuz建议的那种,并且它有效
在执行期间,我使用
将当前进程ID添加到文件中GetCurrentProcessId
当我启动程序时,我从文件中读取已保存的processIds,然后确定哪些当前正在运行的进程是我已经运行的子进程,之后我创建了一个线程来打开并再次监视
uses tlhelp32;
----
var Snap:THandle;
ProcessE:TProcessEntry32;
----
Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
ProcessE.dwSize:=SizeOf(ProcessE);
if Process32First(Snap,ProcessE) then
begin \\Iterate through running processes
while Process32Next(Snap,ProcessE) do
\\Determine whether it's a child process of the saved PiD
if ProcessE.th32ParentProcessID = mySavedPiD then
\\ Creating the thread to monitor the process
cnThread:=TContinueThread.Create(ProcessE.th32ProcessID);
cnThread.Start;
\\ In the thread Execute
var hndl:THandle;
----
hndl:=OpenProcess(PROCESS_ALL_ACCESS ,False,PiD);
WaitForSingleObject(hndl, INFINITE);
它可能不是最好的解决方案,但它现在适用于我,但是,我仍然需要处理delta(在我的程序缺席期间完成的过程)
答案 1 :(得分:0)
为每个已启动的进程创建一个线程会浪费一个线程。和internal thread resources are limited。如果您现在正在使用WaitForSingleObject(,INFINITE)
,请花时间了解WaitForMultipleObjects
并启动单个线程以等待多个进程。 (或者像@DavidHeffernan建议的那样了解jobs)