了解WaitForSingleObject和WaitForMultipleObject

时间:2013-09-27 14:53:47

标签: c++ createprocess

我有一个Windows服务,我收到http请求并启动一个可能运行一个多小时的进程。当进程结束时,我需要在主服务中得到通知。当服务结束时,我需要终止所有子进程。我明白,如果我做waitforsingleobject它将挂起在Windows服务,直到该过程完成,并没有进一步的http请求将被接受?我现在正在关注哪个有效,但其方法不正确。

if(CreateProcess( TEXT(EXEPATH),   
                procArguments, 
                NULL,          
                NULL,          
                FALSE,         
                0,             
                NULL,          
                NULL,          
                &si,           
                &pi )          
            ) 
            {
                 processHandles[processCount] = pi.hProcess;                 
                 processStreams[processCount] = eventId.c_str();                    
                 processCount++;                 
             }      

服务停止我正在这样做

for(int index=0;index<10;index++){
            g_pAppLog->Log("Stop Process for processStreams[%d] %s\n",index,processStreams[index].c_str());

            int terminationResult = TerminateProcess(processHandles[index],1);                  

        }

3 个答案:

答案 0 :(得分:0)

函数WaitForSingleObjectExWaitForMultipleObjectsEx允许您指定超时,以便函数不会永久挂起。

因此,您可以在循环中调用该函数,检查该进程是否真正终止,或者它只是超时到期。

无论如何,你不应该等待任何事情,除非你没有更好的事情要做。 如果您有Web服务器,则应该监听连接并生成响应进程。 如果您只想检查流程是否已终止,可以致电GetExitCodeProcess

总而言之,您可能会:

  1. 运行一个循环:
    1. 接受请求;
    2. 产生一个过程;
    3. 检查以前创建的任何进程是否终止(没有阻塞);
  2. 创建一个双线程应用程序,其中一个线程接受请求,另一个线程在循环中调用WaitForMultipleObjectsEx,并可能处理子节点终止。

答案 1 :(得分:0)

在您的主服务中,您应该创建一个线程来执行该操作,因此主线程仍然可以正在运行..在此线程中,您应该使用WaitforMultipleObjects等待所有子进程结束,一旦进程结束,相应的代码将被执行。

请查看MSDN了解详情

答案 2 :(得分:0)

在与处理SCM请求的线程不同的线程中进行等待。使用CreateEvent()创建一个可等待的手动重置事件,然后让等待的线程使用WaitForMultipleObjects()同时等待事件和子进程。 WaitForMultipleObjects()会告诉您首先发出信号。停止服务时,使用SetEvent()向事件发出信号。当子进程退出时,将发出其句柄信号。如果事件首先发出信号,则等待的线程可以在子进程上调用TerminateProcess()