2013-09-27 74 views
1

我有一個Windows服務,我正在接收http請求並啓動一個可能運行超過一個小時的進程。當流程結束時,我需要在主要服務中得到通知。而當服務結束時,我需要終止所有子進程。我明白,如果我做了waitforsingleobject它將掛在Windows服務,直到該過程完成,並沒有進一步的http請求將受理?我現在正在追蹤哪些方法有效,但它的方法不正確。瞭解WaitForSingleObject和WaitForMultipleObject

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

功能WaitForSingleObjectExWaitForMultipleObjectsEx允許您指定超時,這樣的功能永遠不會掛起。

因此,您可以在循環中調用函數,檢查進程是否真正終止,或者它只是超時過期。

無論如何,你不應該等待任何事情,除非你沒有更好的辦法。 如果你有一個Web服務器,你應該聽連接併產生響應過程。 如果你只是想檢查一個進程是否終止,你可以撥打GetExitCodeProcess

所以,總結起來,你可能之一:

  1. 運行一個循環:
    1. 接受的請求;
    2. 衍生出一個過程;
    3. 檢查是否有以前創建的進程終止(沒有阻塞);
  2. 創建一個雙線程應用程序,其中一個線程接受請求,另一個在循環中調用WaitForMultipleObjectsEx,並且可能處理子終止。
0

在你的主要服務,您應該創建一個線程來做到這一點,那麼主線程仍然可以運行。在這個線程,你應該使用WaitForMultipleObjects的等待所有的子進程結束,一旦過程結束後,相應的代碼將被執行。

請查看MSDN瞭解詳細信息

0

執行等待在不同的線程比正在處理SCM請求之一。使用CreateEvent()創建一個可等待的手動重置事件,然後讓等待線程使用WaitForMultipleObjects()同時等待事件和子進程。 WaitForMultipleObjects()會告訴你哪一個是先發信號。當服務停止時,用SetEvent()通知事件。當子進程退出時,它的句柄將發出信號。如果事件首先發出信號,則等待線程可以在子進程上調用TerminateProcess()