CreateProcess怎样等待孙线程结束?

adamwyb 2009-08-19 09:45:57
MSDN上有段例子代码如下:
if( !CreateProcess( NULL, // No module name (use command line).
strCmdLine.GetBuffer(), // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
ErrorExit( "CreateProcess failed." );
}

// Wait until child process exits.
DWORD dRet = WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hThread );
CloseHandle( pi.hProcess );

我有2个疑问:
1,我看了下CreateProcess的解释,是说如果等待由CreateProcess启动子线程结束,那么需要使用WaitForInputIdle,但是这里如果换成WaitForInputIdle的话,是没法等待子线程结束的,必须用WaitForSingleObject,我想知道为什么用WaitForInputIdle会不成功,以及他俩的区别;
2,如果由CreateProcess产生的子线程又启动了一个新的线程,相当于这个程序的孙线程,开启孙线程后,子线程就结束了,孙线程继续运行,过一段时间孙线程才结束。我想问下,通过什么方法可以等待孙线程结束?甚至孙线程的子线程结束。也就是说,如何使用类似WaitForSingleObject的方法,等待子线程以及所有由子线程生成的线程全部结束后,才返回?

谢谢!
...全文
394 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
adamwyb 2009-08-28
  • 打赏
  • 举报
回复
恩,谢谢大家,虽然没解决,也学到不少东西
jmliqing2 2009-08-28
  • 打赏
  • 举报
回复
路过,看看各位高人怎么解决VC难题之
peterboboo 2009-08-25
  • 打赏
  • 举报
回复
孙进程是由CreateProcess创建的进程创建的。
例如有a.exe,b.exe两个程序,
我用CreateProcess启动了a.exe,接着a.exe又创建了b.exe,然后a.exe就退出了,b.exe又运行了一段时间才退出,可是CreateProcess只能得到a.exe的句柄,b.exe句柄就没法去等待了?
按你这个说,如果A.exe的代码如过是你自己写的话:
那问题简化为A.exe和主进程之间通信的问题,只要A能将B的句柄通知给主进程,应该就可以了。进程通信的方法很多,自定义消息、剪贴板、油槽、管道都行。
如果A.exe的代码不是你自己写的话,暂时没有太好的办法,我能想到的就是就是在A结束后,枚举系统进程,找到B进程并获取B的句柄。
adamwyb 2009-08-25
  • 打赏
  • 举报
回复
孙进程是由CreateProcess创建的进程创建的。
例如有a.exe,b.exe两个程序,
我用CreateProcess启动了a.exe,接着a.exe又创建了b.exe,然后a.exe就退出了,b.exe又运行了一段时间才退出,可是CreateProcess只能得到a.exe的句柄,b.exe句柄就没法去等待了?
hali999 2009-08-25
  • 打赏
  • 举报
回复
进来学习一下
fox000002 2009-08-25
  • 打赏
  • 举报
回复
lz 可以考虑各种 IPC 的方法,获取和传递这个句柄
adamwyb 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 oyljerry 的回复:]
引用 5 楼 adamwyb 的回复:
初学乍道,见笑了,那通过什么方法将孙进程的句柄给父进程呢?是不是也用WaitForSingleObject等待?

创建孙进程的时候,CreateProcess返回的句柄保存,然后用WaitForSingleObject等待
[/Quote]

孙进程是由CreateProcess创建的进程创建的。
例如有a.exe,b.exe两个程序,
我用CreateProcess启动了a.exe,接着a.exe又创建了b.exe,然后a.exe就退出了,b.exe又运行了一段时间才退出,可是CreateProcess只能得到a.exe的句柄,b.exe句柄就没法去等待了?
huadust 2009-08-20
  • 打赏
  • 举报
回复
进来学习学习
oyljerry 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 adamwyb 的回复:]
初学乍道,见笑了,那通过什么方法将孙进程的句柄给父进程呢?是不是也用WaitForSingleObject等待?
[/Quote]
创建孙进程的时候,CreateProcess返回的句柄保存,然后用WaitForSingleObject等待
蒋晟 2009-08-19
  • 打赏
  • 举报
回复
WaitForInputIdle只等到目标准备接收消息。
你等的是进程不是线程,创建线程之后进程不会结束的。
fox000002 2009-08-19
  • 打赏
  • 举报
回复
感觉 lz 的进程和线程概念有些混乱
xingzhe2001 2009-08-19
  • 打赏
  • 举报
回复
WaitForMulitObject?
adamwyb 2009-08-19
  • 打赏
  • 举报
回复
初学乍道,见笑了,那通过什么方法将孙进程的句柄给父进程呢?是不是也用WaitForSingleObject等待?
  • 打赏
  • 举报
回复
你说的都应该是进程吧。
父进程可以知道子进程结束,子进程可以知道孙进程结束,
当子进程结束时,把没有结束的孙进程句柄给父进程(进程通讯)。
如果是线程就简单多了。建个列表呗
作者:yurunsun@gmail.com 新浪微博@雨润 新浪博客 CSDN博客日期:2012年11月5日

7,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧