有个线程用CreateProcess创建了一个子进程【7Z.exe命令行解压的进程】,但这个子进程某些情况下会把内存给占完。于是我想做一个监控线程,发现7Z.exe运行时间操作60秒了,就用taskkill把7Z.exe的进程给结束掉。
我的想法是在CreateProcess前设置一个Event.等7Z返回后再释放Event.
另一个监控线程用WaitForSingleObject(m_hEvent, 60000)去等待.如果发现是因为超过了60S,7Z还在执行的话,就把它给结束掉。
其他情况下不执行结束7Z.exe的操作。但我基础太差实现不了,希望大家帮帮忙。

解决方案 »

  1.   

    PROCESS_INFORMATION pi = {0};
    CreateProcess(..., &pi)不是有个pi.hProcess句柄吗?
    WaitForSingleObject(pi.hProcess, 60000);
    if(GetExitCodeProcess(pi.hProcess, &dwExitCode) && (STILL_ACTIVE == dwExitCode))
    {
     TerminiateProcess(pi.hProcess);
    }
    CloseHandle(pi.hProcess);大致上是这样的
      

  2.   

    首先我觉得楼主应该专注于为啥会内存不够,解决根因才是最重要的。你这方法完全就是缓兵之计。接着我说下实际的,就是你这个需求。
    看看偶的blog,
    进程监视你CreateProcess之后也不需要什么什么Event内核对象了。直接起定时器,SetTimer,在60秒后调用OnTimer回调函数中调用我blog里面的函数。如果存在就Taskkill。解决了
      

  3.   

    主要是7Z那个程序是官网下载的,解压一些有分卷,但有些卷不在的情况下,会很费时。
    而且有些像压缩炸弹这样的文件,7Z会无限占内存的。 我作为调用方,无法克服这些问题呀。你给的建议非常好,你blog的代码也能解决问题。 谢谢你呀。呵呵。
      

  4.   


    老大这方法的确好,受教了。
    不过我调用7Z.exe,需要将它的输出信息重定向到我创建的管道中,没有适合的时机用WaitForSingleObject呀。 
    正常情况下:程序将管道信息读完后,7Z.exe进程会自动结束.
    如果7Z产挂死了,ReadFile可能会一直不返回。这时候内存一直暴涨。//CreateProcess之后获取管道信息
    while (true) 
    {
    if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
    break;
    msg += buffer;
      

  5.   


    //这是执行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);
      

  6.   

    ReadFile可能会一直不返回这个函数也可以异步的吧.
      

  7.   

    读管道可以用select方式,参照socket