-1

これが私がしなければならないことです - 1. ハンドル threadHandle を定義し、ハンドル h[20] の配列を定義します...ここで、配列の各エントリには値 threadHandle があります。

  1. 私のコードは 20 のスレッドを開きます。完了すると、各スレッドはメイン スレッドに通知する必要があり、すべてのスレッドが通知を受け取ると、メイン スレッドは何かをログ ファイルに記録する必要があります。

私は次のようなことをする予定です:

threadHandle と上で定義したハンドル h[20} の配列を定義します。

コードが 20 のスレッドを開いたら、次のことを行います -waitformultipleobjects(NULL,20,h,true,10000)

ここで、コードは h 配列内のすべてのハンドルが設定されるのを待ってから、待機を返します。しかし、h の値はすべて同じであるため、wait 関数はエラーを返します。これを回避する方法はありますか?私は基本的にすべてのスレッドが呼び出し元のスレッドに信号を送る必要があります... 20 個のスレッドのそれぞれに 20 個のハンドラーを定義することも良い考えではないようです。

代わりにこのようなことはできますか?-

threadHandle とハンドルの配列 h[20] を定義します。メイン スレッドにシグナルを返したスレッド数の変数カウントを維持します。

waitforsingleobject(threadHandle)

これが戻ったら、count をインクリメントし、count < 20 の場合は上記の wait ステートメントを繰り返します。count = 20 までそれを続けてから、ファイルに記録します。もちろん、その間にいずれかの待機がタイムアウトになった場合は、失敗をログ ファイルに記録します。

私はこれを試していますが、これを行うより良い方法があるかどうか疑問に思っていました。

ティア。アナンド

4

3 に答える 3

1

代わりに1つのセマフォを使用して(CreateSemaphore()APIを参照、カウントは0に初期化されます)、すべてのスレッドが通知します。forループ内のWaitForSingleObjectは、最大20までカウントします。セットアップがはるかに簡単で、イベントを見逃すことはなく、(理由の範囲内で)任意の数のスレッドで機能します。

于 2013-01-07T09:30:45.940 に答える
1

20 個のイベント オブジェクトを作成します。それらのハンドルを に入れhます。作成する各スレッドに 1 つ渡します。スレッドが親に通知する必要がある場合、そのイベントを通知します。親はイベント ハンドルを待機し、それらがすべて通知されると、ログに書き込みます。

于 2013-01-07T05:16:34.667 に答える
0

Maintain a variable count for the number of threads. はい、できます。

nCount The number of object handles in the array pointed to by lpHandles. The maximum number of object handles is MAXIMUM_WAIT_OBJECTS. This parameter cannot be zero.

nCount は配列のサイズではなく、待機するハンドルの数を指定しています。ただし、配列サイズを超えてはならず、両方とも MAXIMUM_WAIT_OBJECTS を超えてはなりません。

ヒント: これは、スレッド ハンドルなどの特定のハンドルに限定されません。このようにして、さまざまな待機可能なハンドルの混合を処理できます。( MSDN WaitForMultipleObjects 関数)

But since all the values of h are the same... いいえ、それらは同じではなく、WaitForMultipleObjectsそれに応じて戻り値が異なります (WAIT_OBJECT_0 + nCount)。

于 2013-01-07T09:03:41.117 に答える