#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 .