2013-09-27 3 views
1

У меня есть служба Windows, где я получаю HTTP-запросы и запускаю процесс, который может занять больше часа. Мне нужно получить уведомление в главной службе, когда процесс завершится. И когда служба закончилась, мне нужно завершить все дочерние процессы. Я понимаю, что если я буду ждать, то он будет зависать на службе 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

Функции WaitForSingleObjectEx и WaitForMultipleObjectsEx позволяют указать тайм-аут, так что функция не будет висеть вечно.

Таким образом, вы можете вызывать функцию в цикле, проверяя, действительно ли процесс завершен, или это просто истечение времени ожидания.

Во всяком случае, вам не стоит ждать, если только вам нечем заняться. Если у вас есть веб-сервер, вы должны прислушиваться к процессам подключения и создания ответов. Если вы просто хотите проверить, завершен ли процесс, вы можете позвонить по номеру GetExitCodeProcess.

Итак, подводя итог, можно либо:

  1. Выполнить цикл, который:
    1. принимает запрос;
    2. порождает процесс;
    3. проверяет, завершен ли какой-либо из ранее созданного процесса (без блокировки);
  2. Сделайте двухпоточное приложение с одним потоком, принимающим запросы, а другое - вызовом WaitForMultipleObjectsEx в цикле и, возможно, с обработкой прерывания для детей.
0

В вашей основной службе вы должны создать поток, чтобы сделать это, поэтому основной поток все еще может быть запущен. В этом потоке вы должны использовать WaitforMultipleObjects, чтобы дождаться завершения всего дочернего процесса, процесс завершается, соответствующий код будет выполнен.

Пожалуйста, проверьте MSDN для деталей

0

ли ожидание в другом потоке, чем тот, который находится в обработке запросов SCM. Используйте CreateEvent(), чтобы создать ожидаемое событие с ручным сбросом, а затем ожидание потока использует WaitForMultipleObjects(), чтобы ждать как события, так и дочернего процесса одновременно. WaitForMultipleObjects() расскажет, какой из них сигнализирован первым. Когда услуга остановлена, сообщите об этом событию SetEvent(). Когда дочерний процесс выйдет, его ручка будет сигнализирована. Если событие сначала сигнализируется, ожидающий поток может вызвать TerminateProcess() в дочернем процессе.

Смежные вопросы