和WaitForMultipleObject

和WaitForMultipleObject

我有一个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);

        }

最佳答案

函数WaitForSingleObjectExWaitForMultipleObjectsEx允许您指定超时,因此该函数不会永远挂起。

因此,您可以在循环中调用该函数,以检查该进程是否确实终止了,或者只是超时而已。

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

因此,总结起来,您可以:


运行一个循环:

接受请求;
产生一个过程;
检查任何先前创建的进程是否终止(无阻塞);

制作一个两线程应用程序,一个线程接受请求,另一个线程在循环中调用WaitForMultipleObjectsEx,并可能处理子终止。

10-08 11:51