0

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 や、思いついた全体的な設計に関する提案を探しています。

4

2 に答える 2

2

プロセスが終了したかどうかを確認する最も簡単な方法は、そのハンドルを待機することです。いくつかの方法でそれを行うことができます:

  1. すべてのプロセス ハンドルの配列を作成し、 WaitForMultipleObjects (bWaitAll が FALSE) を使用してそれらすべてを待機します。次に、コードが続行されると、どのプロセスが終了したかを把握し、新しいプロセスを作成し、配列を更新して、もう一度待つ必要があります。
  2. 40 個のスレッドを実行し、それぞれが 1 つのプロセスを作成し、その 1 つのハンドルを無限に待機します (WaitForSingleObject を使用)。次に、そのタスクが終了すると、そのスレッドは新しいタスクを作成して待機する責任があります。
  3. 40 個のスレッドを作成したくない場合は、(WFSO を使用して) 各プロセス ハンドルを短時間待機するスレッドを 1 つ用意し、戻り値を確認します。この方法では、プログラムの応答は遅くなりますが、終了したプロセスを認識しやすくなり、多くのスレッドを作成する必要がなくなります。
于 2011-09-22T06:41:37.653 に答える
1

プールを待機操作に置き換えたい場合は、作成されたプロセスに WaitForSignalObject/WaitForMultipleObjects を使用できます。プロセスが終了すると、プロセス ハンドルがシグナル状態になります。プーリングとは異なり、待機操作は CPU を消費しません。オブジェクトの 1 つが通知されない限り、待機中のスレッドは非アクティブです。

于 2011-09-22T06:38:07.710 に答える