提问人:Luchian Grigore 提问时间:9/22/2011 最后编辑:Luchian Grigore 更新时间:9/22/2011 访问量:1873
C++ 中的任务监视器和管理器
Task monitor and manager in C++
问:
我希望使用 Win32 API 构建任务监视器/管理器。它将使用命令行参数启动(最好作为 Windows 服务),指定它应该启动新进程的实例数。
task_man.exe 40
将启动该进程的 40 个实例
task.exe
现在,每当任务.exe退出(正确与否)时,我都必须启动一个新任务来替换它。
我的粗略想法是这样的:
从 task_man 启动任务,获取其 PID,然后有一个循环来检查 PID 是否都是活动进程。对于每个无效的 PID,启动一个新进程,并用新 PID 替换旧 PID。
有没有更好的设计,或者更好的工作流程?有没有标准方法可以做到这一点?我不想重新发明轮子......另外,我应该研究哪些 API?
我也在寻找一种易于事后更改的设计——即如果我运行
task_man.exe 30
之后,新task_man不应开始运行,而应更改前一个实例中的任务数。(我知道它会开始运行,我说它应该修改原始版本然后退出)
我不是在寻找代码(因为我不是在寻找完整的实现,也不是说我介意查看示例),而是我可以使用哪些 API,或者对我提出的整体设计的建议。
答:
1赞
Alex F
9/22/2011
#1
如果要将池化替换为等待操作,则可以将 WaitForSignalObject/WaitForMultipleObjects 用于创建的进程。当进程退出时,进程句柄将发出信号。与池化不同,等待操作不消耗 CPU。等待线程处于非活动状态,除非其中一个对象发出信号。
2赞
Eran
9/22/2011
#2
判断进程是否已退出的最简单方法是等待其句柄。您可以通过以下几种方式执行此操作:
- 生成所有进程句柄的数组,并使用 WaitForMultipleObjects(bWaitAll 为 FALSE)等待所有进程句柄。然后,当你的代码继续时,你必须弄清楚哪个进程结束了,创建一个新进程,更新数组,然后再次等待。
- 运行 40 个线程,每个线程创建一个进程并无限等待其一个句柄(使用 WaitForSingleObject)。然后,当该任务结束时,该线程将负责创建一个新任务并等待它。
- 如果不想创建 40 个线程,只需让一个线程在每个进程句柄上等待短时间(使用 WFSO),然后检查返回值。这样程序的响应速度会变慢,但更容易识别已结束的进程,并且不会创建很多线程。
评论