1

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

        }
4

3 回答 3

0

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

于 2013-09-27T15:20:00.380 回答
0

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

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

无论如何,你不应该等待任何事情,除非你没有更好的事情可做。如果你有一个网络服务器,你应该监听连接并产生响应进程。如果你只是想检查一个进程是否终止,你可以调用GetExitCodeProcess.

因此,总结起来,您可能会:

  1. 运行一个循环:
    1. 接受请求;
    2. 产生一个进程;
    3. 检查是否有任何先前创建的进程终止(没有阻塞);
  2. 制作一个双线程应用程序,一个线程接受请求,另一个线程WaitForMultipleObjectsEx循环调用,并可能处理子终止。
于 2013-09-27T15:07:53.057 回答
0

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

详情请查看 MSDN

于 2013-09-27T15:09:45.503 回答