2011-09-22 103 views
0

我正在寻找使用Win32 API来构建任务监视器/管理器。它将通过一个命令行参数来启动(最好是一个windows服务),指定一个新进程应该启动多少个实例。C++中的任务监视器和管理器

task_man.exe 40 

将启动过程

task.exe 

现在,每当task.exe退出(正确与否),我将不得不开始一个新的来取代它的40个实例。

我粗略的想法是这样的:

开始从task_man任务,得到他们的PID,然后有一个循环,检查的PID是否所有活动进程。对于每个无效的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创建进程。进程句柄在进程退出时发出信号。与池不同,等待操作不会占用CPU。等待线程处于非活动状态,除非其中一个对象发出信号。