我有一个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);
}
最佳答案
函数WaitForSingleObjectEx
和WaitForMultipleObjectsEx
允许您指定超时,因此该函数不会永远挂起。
因此,您可以在循环中调用该函数,以检查该进程是否确实终止了,或者只是超时而已。
无论如何,除非有更好的事情要做,否则您不应该等待任何事情。
如果您有Web服务器,则应收听连接并生成响应过程。
如果只想检查进程是否终止,则可以调用GetExitCodeProcess
。
因此,总结起来,您可以:
运行一个循环:
接受请求;
产生一个过程;
检查任何先前创建的进程是否终止(无阻塞);
制作一个两线程应用程序,一个线程接受请求,另一个线程在循环中调用WaitForMultipleObjectsEx
,并可能处理子终止。