我有一个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);
}
答案 0 :(得分:0)
函数WaitForSingleObjectEx
和WaitForMultipleObjectsEx
允许您指定超时,以便函数不会永久挂起。
因此,您可以在循环中调用该函数,检查该进程是否真正终止,或者它只是超时到期。
无论如何,你不应该等待任何事情,除非你没有更好的事情要做。
如果您有Web服务器,则应该监听连接并生成响应进程。
如果您只想检查流程是否已终止,可以致电GetExitCodeProcess
。
总而言之,您可能会:
WaitForMultipleObjectsEx
,并可能处理子节点终止。答案 1 :(得分:0)
在您的主服务中,您应该创建一个线程来执行该操作,因此主线程仍然可以正在运行..在此线程中,您应该使用WaitforMultipleObjects等待所有子进程结束,一旦进程结束,相应的代码将被执行。
请查看MSDN了解详情
答案 2 :(得分:0)
在与处理SCM请求的线程不同的线程中进行等待。使用CreateEvent()
创建一个可等待的手动重置事件,然后让等待的线程使用WaitForMultipleObjects()
同时等待事件和子进程。 WaitForMultipleObjects()
会告诉您首先发出信号。停止服务时,使用SetEvent()
向事件发出信号。当子进程退出时,将发出其句柄信号。如果事件首先发出信号,则等待的线程可以在子进程上调用TerminateProcess()
。