2

スレッドが戻るまでプログラムを停止する Windows API の WaitFor* 関数を使用せずにマルチスレッドを実装する方法に興味があります。メインアプリケーションのサイズ変更や移動などが停止する場合、スレッドを使用する意味は何ですか?

スレッド関数を呼び出してから戻り、実行が終了したときにスレッドの戻り値を処理できる、スレッドを使用した Windows メッセージングの形式はありますか?

4

4 に答える 4

3

タスクスレッドがタスクを終了したことをUIスレッドに知らせたい場合は、タスクスレッドに(カスタム-WM_USER以降の)メッセージをメインウィンドウに(スレッドIDとハンドルとともに)送信させることができます。また、メインウィンドウのウィンドウプロシージャは、特定のタスクスレッドがそのタスクを終了したことを知ることができます。このように、UIスレッドはスレッドオブジェクトで(WaitFor *を使用して)アクティブに待機する必要はありません。

于 2012-11-28T11:53:51.213 に答える
2

MsgWaitForMultipleObjectsExスレッドが終了するのを待つと同時にメッセージを処理するために使用できます。

于 2012-11-28T11:53:03.887 に答える
1

WaitForSingleObjectノンブロッキングにすることができます。2 番目のパラメーターとしてゼロ タイムアウトを渡すだけです。

// Check is thread has been finished
if(::WaitForSingleObject(threadHandle, 0) == WAIT_OBJECT_0)
{
   // Process results
   ...
}

この状態を定期的に確認する必要があります。たとえば、タイマーで、またはメッセージ ループ内のメッセージを処理した後に確認する必要があります。

または、 を使用できますMsgWaitForMultipleObjectsEx。スレッドメッセージキューの呼び出しでメッセージ/入力イベントが発生すると、ブロックが解除されて戻ります。

他の回答が述べたように、別の方法があります.Windows非同期に投稿されたメッセージを使用して、スレッドが作業を完了したことを通知します。この方法には欠点があります。作業スレッドは、メッセージをポストするターゲット ウィンドウまたはスレッドを認識している必要があります。この依存関係は設計を複雑にし、スレッド/ウィンドウの有効期間のチェックに関する問題を引き起こします。それを避けるために、メッセージブロードキャスト ( PostMessage(HWND_BROADCAST,...)) を使用できますが、これはあなたのケースではやり過ぎなので、お勧めしません。

于 2012-11-28T11:58:01.010 に答える