有个线程用CreateProcess创建了一个子进程【7Z.exe命令行解压的进程】,但这个子进程某些情况下会把内存给占完。于是我想做一个监控线程,发现7Z.exe运行时间操作60秒了,就用taskkill把7Z.exe的进程给结束掉。
我的想法是在CreateProcess前设置一个Event.等7Z返回后再释放Event.
另一个监控线程用WaitForSingleObject(m_hEvent, 60000)去等待.如果发现是因为超过了60S,7Z还在执行的话,就把它给结束掉。
其他情况下不执行结束7Z.exe的操作。但我基础太差实现不了,希望大家帮帮忙。
我的想法是在CreateProcess前设置一个Event.等7Z返回后再释放Event.
另一个监控线程用WaitForSingleObject(m_hEvent, 60000)去等待.如果发现是因为超过了60S,7Z还在执行的话,就把它给结束掉。
其他情况下不执行结束7Z.exe的操作。但我基础太差实现不了,希望大家帮帮忙。
CreateProcess(..., &pi)不是有个pi.hProcess句柄吗?
WaitForSingleObject(pi.hProcess, 60000);
if(GetExitCodeProcess(pi.hProcess, &dwExitCode) && (STILL_ACTIVE == dwExitCode))
{
TerminiateProcess(pi.hProcess);
}
CloseHandle(pi.hProcess);大致上是这样的
看看偶的blog,
进程监视你CreateProcess之后也不需要什么什么Event内核对象了。直接起定时器,SetTimer,在60秒后调用OnTimer回调函数中调用我blog里面的函数。如果存在就Taskkill。解决了
而且有些像压缩炸弹这样的文件,7Z会无限占内存的。 我作为调用方,无法克服这些问题呀。你给的建议非常好,你blog的代码也能解决问题。 谢谢你呀。呵呵。
老大这方法的确好,受教了。
不过我调用7Z.exe,需要将它的输出信息重定向到我创建的管道中,没有适合的时机用WaitForSingleObject呀。
正常情况下:程序将管道信息读完后,7Z.exe进程会自动结束.
如果7Z产挂死了,ReadFile可能会一直不返回。这时候内存一直暴涨。//CreateProcess之后获取管道信息
while (true)
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
msg += buffer;
}
//这是执行7Z的代码。
if (!CreateProcess(NULL,(LPTSTR)(LPCTSTR)strCmd ,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
CloseHandle(hRead);
CloseHandle(hWrite);
return FALSE;
}
CloseHandle(hWrite);
char buffer[4096] = {0};
DWORD bytesRead;
while (true)
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
msg += buffer;
}
CloseHandle(hRead);