Ожидание завершения процесса? [VS9 C ]

#c #process

#c #процесс

Вопрос:

В моей системе есть приложение (App.exe ) это выполняется, но иногда оно завершается (изящно и ожидаемо). В то же время у меня есть другое приложение, которое, когда App.exe остановлен, необходимо выполнить определенные задачи. Итак, мне нужен способ отслеживать App.exe из моего приложения.

Я пытаюсь выполнить что-то вроде следующего

 If (App.exe is running wait 360 seconds for it to terminate)
   if (App.exe is not running anymore)
      do the work I need to do when App.exe is NOT running
  

Итак, они являются КЛЮЧОМ:

  • как мне оценить, если App.exe выполняется
  • как мне подождать 360 секунд, пока он закроется (если он все еще запущен)

Теперь это не очень сложно, если мое приложение является onw, которое запустилось / развернуто App.exe (с использованием CreateProcess и WaitForExit), но в этом случае я не являюсь управляющим агентом … итак, как мне отслеживать, чтобы увидеть, если App.exe все еще выполняется и, следовательно, ожидает (в течение периода времени X) его завершения, прежде чем делать что-то конкретное?

Любые подсказки, помощь или рекомендации будут высоко оценены. Спасибо,

Ответ №1:

Вы можете использовать API-интерфейсы ToolHelp (CreateToolhelp32Snapshot с TH32CS_SNAPPROCESS и Process32Next), чтобы получить идентификатор процесса любого запущенного app.exe процессы. Исходя из этого, вы можете использовать OpenProcess для получения дескриптора, который затем можно использовать для ожидания завершения.

Ответ №2:

Как насчет вызова FindWindow для получения дескриптора (или дескрипторов, если приложение может иметь несколько экземпляров или изменяет его название на основе открытых документов), вызова GetWindowThreadProcessId и OpenProcess для его преобразования, а затем вызова WaitForSingleObject?

Комментарии:

1. Вам все еще нужно вызвать OpenProcess() ; идентификатор процесса не является дескриптором.

2. Если приложение является сторонним, функция FindWindow() несколько подвержена сбоям. Заголовки окон и имена классов могут меняться в зависимости от версий. Подход, основанный на Toolhelp, более надежный.

Ответ №3:

Я полагаю, вы могли бы использовать GetProcessesByName().

Комментарии:

1. Во-первых, это называется GetProcessesByName (множественное число). Во-вторых, это управляемый API, и OP работает на C .