2011-09-22 4 views
0

Win32 APIを使用してタスクモニター/マネージャーをビルドしようとしています。これは、開始する新しいプロセスのインスタンスの数を指定するコマンドライン引数で開始されます(Windowsサービスとして)。C++のタスクモニターとマネージャー

task_man.exe 40 

はいつでもtask.exe終了(正常かどうか)、今、プロセスの40個のインスタンス

task.exe 

を開始します、私はそれを置き換えるために新しいものを開始する必要があります。 PIDは、すべてのアクティブなプロセスがあるかどうかをチェックするループを持って、その後自分のPIDを取得し、

スタートtask_manからタスク:

私のラフなアイデアは、これにあります。すべての無効な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(FALSEというbWaitAll)を使用します。次に、コードが続行されたら、どのプロセスが終了したか把握し、新しいプロセスを作成し、アレイを更新してから再度待機する必要があります。
  2. それぞれ40個のスレッドを実行し、それぞれが1つのプロセスを作成し、1つのハンドル(WaitForSingleObjectを使用)で無期限に待機します。その後、そのタスクが終了すると、そのスレッドは新しいスレッドを作成して待機します。
  3. 40個のスレッドを作成したくない場合は、(WFSOを使用して)各プロセスハンドルで短時間待機し、戻り値を確認してください。あなたのプログラムはこのように応答が遅くなりますが、終了したプロセスを認識する方が簡単で、多くのスレッドを作成することはありません。
+0

私は2番をして、それは魅力のように動作します。ありがとう。 –

1

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

関連する問題