2009-03-06 16 views
1

私は最近、ATLのCThreadPoolクラスを発見しました。この発見で非常に満足していました。これは、タスクのいくつかのキューを処理するために複数のワーカースレッドを持つ同期化のセマンティクスを処理するきちんとした小さなクラスです。タスクは、いくつかの外部プロセスによってCThreadPoolオブジェクトに供給されます。CThreadPoolで作業が完了したときを知る方法?

クリーンで非常にきれいですが、すべてのタスクが遂に完了したかどうかを調べる方法はないようです。それを行う最善の方法は何ですか?

たとえば、10の重い計算タスクを実行してから別の処理を行う必要があるとします。私は仕事が完了したことを知るまで私は移動することができません。

私は10個のスレッドでCThreadPoolを作成し、タスクをキューに入れ、スレッドから外します。タスクが完了したら、どうすればわかりますか?

ボアズ

答えて

1

私はあなたの労働者のオブジェクトのメソッドExecute()「メイン」スレッドが監視できるというIPCのいくつかのフォームを使用している必要がありますだと思います。何かのように、Execute()メソッド呼び出しReleaseSemaphore()をメインスレッドが待機できるセマフォに持ち、待ち時間が何回完了したかを数えます。または、スレッドプールのワーカーは、メインスレッドがメッセージを取得するメッセージキューに作業項目があることを示すメッセージを送信できます。

1

完了したタスクを最も確実に待つ方法は、eventを作成し、その後WaitForSingleObjectを呼び出してワーカースレッドが終了するのを待つことです。

関連する問題