2011-09-22 3 views
0

Я ищу, чтобы создать монитор/менеджер задач с помощью Win32 API. Он будет запущен (желательно как служба Windows) с аргументом командной строки, определяющим, сколько экземпляров нового процесса он должен запустить.Монитор задач и менеджер в C++

task_man.exe 40 

Начнет 40 экземпляров процесса

task.exe 

Теперь, всякий раз, когда task.exe выходов (правильно или нет), я должен буду начать новый, чтобы заменить его.

Моей грубая идея:

Запустить задачи из task_man, получить их ИДП, а затем цикл, который проверяет, является ли ИДП всех активных процессов. Для каждого недопустимого PID запустите новый процесс и замените старый PID на новый.

Есть ли лучший дизайн, который я могу использовать, или лучший рабочий процесс? Существует ли стандартный метод для этого? Я не хочу изобретать колесо ... Кроме того, какие API-интерфейсы я должен искать?

Я также ищет дизайн, который легко изменить впоследствии - то есть, если я бегу

task_man.exe 30 

после этого, новый task_man не должен начать работать, а это должно изменить количество задач в предыдущем случае. (Я знаю, что он начнет работать, я скажу, что он должен изменить оригинал, а затем выйти)

Я не ищу код (как в Я не ищу полную реализацию, а не то, что я имею в виду просматривая образцы), скорее, какие API-интерфейсы я могу использовать, или предложения по общему дизайну, которые я придумал.

+0

Вы говорите, что вы «не хотите код», но это просто лень, когда существуют программы с открытым исходным кодом, которые вы можете просмотреть. Если бы вы стали грамотными в своей парадигме, вы могли бы даже понять, что усилия, которые вы предпринимаете, будут лучше выражаться как расширение работы других. Прочтите код, посмотрите, какие API они используют, затем прочитайте документацию для этих API. Возможно, хорошее место для начала: http: //processhacker.sourceforge.net/ – HostileFork

+0

@Hostile я отредактировал мой вопрос. –

+0

Не бойтесь полных реализаций, если они находятся на языке, который вы понимаете на соответствующей платформе. В полной реализации часто есть много «реальных» забот в том, что простой образец будет блестеть. Продукт лет разработки инструмента, который люди используют, обычно немного глубже, чем ответ на накопитель StackOverflow. Погрузитесь, оглянитесь вокруг, создайте чужую кодовую базу и пройдите через нее ... это хорошо. – HostileFork

ответ

2

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

  1. построить массив всех технологических ручек, а также использовать WaitForMultipleObjects (bWaitAll быть FALSE), чтобы ждать на них всех. Затем, когда ваш код будет продолжен, вам нужно будет выяснить, какой процесс закончился, создать новый, обновить массив и снова подождать.
  2. Запустите 40 потоков, каждый из которых создает один процесс и бесконечно ждет его одного ручка (используя WaitForSingleObject). Затем, когда эта задача заканчивается, этот поток будет отвечать за создание нового и ждать по нему.
  3. Если вы не хотите создавать 40 потоков, попробуйте один, который будет ждать коротких периодов времени над каждым из обработчиков процессов (используя WFSO) и проверять возвращаемое значение. Ваша программа будет реагировать медленнее таким образом, но было бы легче распознать завершенный процесс, и вы не будете создавать много потоков.
+0

Я сделал номер 2, и он работает как шарм. Благодарю. –

1

Если вы хотите заменить операции объединения на ожидание, вы можете использовать WaitForSignalObject/WaitForMultipleObjects для созданных процессов. Обработка процесса становится сигналом, когда процесс завершается. В отличие от объединения, операции ожидания не потребляют процессор. Ожидающий поток неактивен, если только один из объектов не сигнализирован.

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