我们通常使用的WaitForSingleObject只能等待一个进程结束,如果进程中间又发起了另外一个进程,我们如何知道那个进程结束?
其实,Windows平台上有 Job Objects,可以对进程进行分组管理。只要把一个进程指定给一个Job,其子进程也会自动归属该Job,除非主动脱离。这样,我们就可以通过Job来跟踪整个的进程树了。
示例代码:
你可以在CMD窗口里启动任何的程序,比如notepad.exe,然后在open对话框里使用右键菜单打开其它文件,程序.....如此循环,上面的代码会等待所有程序退出才会结束。
其实,Windows平台上有 Job Objects,可以对进程进行分组管理。只要把一个进程指定给一个Job,其子进程也会自动归属该Job,除非主动脱离。这样,我们就可以通过Job来跟踪整个的进程树了。
示例代码:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE job=CreateJobObject(NULL,NULL);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(STARTUPINFO) );
si.cb = sizeof(STARTUPINFO);
ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );
CreateProcess(L"C:/WINDOWS/system32/cmd.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
AssignProcessToJobObject(job,pi.hProcess);
while(true)
{
JOBOBJECT_BASIC_PROCESS_ID_LIST list;
DWORD length;
QueryInformationJobObject(job,JobObjectBasicProcessIdList,&list,sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST),&length);
if(list.NumberOfProcessIdsInList<=0)
break;
Sleep(1000);
}
CloseHandle(job);
std::cout<<"exit"<<std::endl;
std::cin.get();
return 0;
}
你可以在CMD窗口里启动任何的程序,比如notepad.exe,然后在open对话框里使用右键菜单打开其它文件,程序.....如此循环,上面的代码会等待所有程序退出才会结束。