首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

如何知道CreateProcess的进程已经完全初始化完成

2012-03-27 
怎么知道CreateProcess的进程已经完全初始化完成用CreateProcess创建了一个进程,然后CreateProcess已经返

怎么知道CreateProcess的进程已经完全初始化完成
用CreateProcess创建了一个进程,然后CreateProcess已经返回了。但程序的窗口还才刚刚初始化。
不想用Sleep来等待,因为怕间隔的时间太短。
WaitForInputIdle也不行,WaitForInputIdle返回的时候程序窗口也还是初始化
后来想用EnumWindows,但程序初始化的时候和完全加载完成后所枚举的窗口是一样的。
估计用FindWindow结果也一样。
在网上也找了半天没看到到是怎么处理这种问题的。
哪位大牛能指条明路啊。谢谢先。

[解决办法]
N种解决方法,比如:
1、设一个全局事件,调用了CreateProcess之后等待这个事件,当被创建的进程初始化完毕后SetEvent
2、设一个自定义消息,当被创建的进程初始化完毕后广播这条消息或者向父进程发送这个自定义消息
[解决办法]
//以下在主程序中实现
1.在你的主程序中创建一个命名的 EVENT对象:
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, _T("ExeInitEvent"));
2.在你的主程序中启动子进程, 并等待这个EVENT有信号 (将在子进程中设置这个EVENT有信号)
ShellExecute("YourExe.exe");
WaitForSingleObject(hEvent, INFINITE);//此时主程序等待子进程进行初始化


//以下在子进程中实现
3.在你的子进程(通过ShellExecute启动的)中打开这个命名的EVENT:
HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("ExeInitEvent")));
4.在你的子进程中进行初始化
// COM 初始化
.......
//子进程初始化完毕时,设置这个event有信号, 此时 1.中由于调用
//WaitForSingleObject(hEvent, INFINITE)而进入等待状态的主程序可以继续运行.
SetEvent(hEvent);

[解决办法]
仔细找找窗口在初始化时和初始化结束以后有什么区别,比如说标题,或者窗口可见性,只要找到一个这样的地方,就可以判断了
[解决办法]
很多大型软件的初始化工作是用 PostMessage 或者类似方式启动的,所以你会在初始化完成之前就收到 WaitForInputIdle信号,这种情况没有通用的方式做判断,估计需要在应用的窗口上做文章。
[解决办法]
对于任意的一个子进程,如果不是你写的,那如何定义初始化是否完成都是一个问题,呵呵。
Windows本身也是用延时做的,如Windows内核ntoskrnl.exe加载会话管理器smss.exe时,CreateProcess(smss.exe),等待Handle大约5秒,若Handle在5秒内没有被signal,即smss已持续运行了大约5秒,则看做smss.exe已初始化成功

热点排行