一个关于WaitForMultipleObjects() 的问题,望赐教!

meloyi 发布于 2016/08/31 21:07
阅读 313
收藏 1
int index;
while(1)
{
  index = WaitForMultipleObjects(10, phNormal, false, INFINITE);
  nIndex = nIndex - WAIT_OBJECT_0;
  CloseHandle(phNormal[nIndex]);

}

如参数设置,假设我等待10个进程结束,分别是进程phNormal[0]~phNormal[9]。

情况这样:
  第一次循环,如果同时有3个进程结束了,分别是1、2和3。那么WaitForMultipleObjects()的返回值,指的是phNormal[1]退出了,即等待的对象集中最小的那个对象,这个我明白。

  接下来进入第二次循环,假设没有其它进程退出,那么上次循环就已经退出的2和3号进程还能被WaitForMultipleObjects()等待吗?此时最小的对象:phNormal[2],已经退出的信息,还能被WaitForMultipleObjects()捕捉到吗??

(如有什么没有表述清楚的,还望指正。)


加载中
0
meloyi
meloyi

引用来自“realanan”的评论

只要进程句柄不关闭,当进程结束后,就能一直触发。如果你想通过一个循环找出所有退出的进程,那么那个进程句柄数组phNormal需要重新整理,排除已捕获的进程句柄,否则,每次循环,你只能获得phNormal[1]。

经过验证,你说的是对的,需要重新整理数组(把已经返回的进程句柄去掉),不然每次都会返回phNormal[1],当然这是在我没有关闭句柄phNormal[1],如果没有更小的进程退出的话,才会每次返回phNormal[1]

如果已经CloseHandle(phNormal[1]),那么上述等待WaitForMultipleObjects(10, phNormal, false, INFINITE),10个当中就会包含一个无效句柄,这样将会返回-1,GetLastError()的返回值是6--(句柄无效)。

所以需要去掉已经被我CloseHanld的句柄,将后边的有效句柄前移,改成:WaitForMultipleObjects(9, phNormal, false, INFINITE)。这样才不会出错。

0
g
ghl
你要同时等待10个对象,你把第三个参数设置成TRUE就可以了
meloyi
meloyi
这个我知道,但是我不需要同时等待10个。我想要知道是10个当中的哪些退出了。
0
realanan
realanan
只要进程句柄不关闭,当进程结束后,就能一直触发。如果你想通过一个循环找出所有退出的进程,那么那个进程句柄数组phNormal需要重新整理,排除已捕获的进程句柄,否则,每次循环,你只能获得phNormal[1]。
meloyi
meloyi
嗯,谢谢啊,我试一下。
返回顶部
顶部