Монитор задач и менеджер в C ++ - PullRequest
0 голосов
/ 22 сентября 2011

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

task_man.exe 40

Запустит 40 экземпляров процесса

task.exe

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

Моя грубая идея такова:

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

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

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

task_man.exe 30

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

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

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

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

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

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

...