2009-04-23 4 views
3

ユーザーの操作に応じてアプリを保つのに問題があります。したがって、私は複数のスレッド間でメッセージ処理を分割したいと思います。メッセージの処理が遅すぎるため、反応しないUIがぎくしゃくしています。これを軽減するために複数のスレッドを使用するにはどうすればよいですか?

複数のスレッドを作成して、すべて同じメッセージキューから読み込み、各メッセージを処理できるようにすることはできますか?

もしそうなら、これはどのように達成できますか?

そうでない場合は、この問題を解決する別の方法を提案できますか?

答えて

13

メッセージポンプやUI要素とやりとりするスレッドを複数持つことはできません。そういうわけで、狂気がある。

ワーカースレッドに派生できる長い処理タスクがある場合は、そのようにすることはできますが、それらを管理するには別のスレッドセーフキューを使用する必要があります。

+0

...なぜですか?私はすでにキューを持っていますが、確かに別のものを作成するのではなく、ちょうどそれを再利用するいくつかの、ドロー的な、半分の文書化された、恐ろしく複雑な手段があります。 – Shog9

+0

それはやっかいなことがあっても、Markさんのように問題を適切に処理する方法ではありません。 ウィンドウのサイズ変更などの問題が発生した場合は、WM_SIZEを処理するコードのように見えます。 –

+1

「そうそう、狂気がある」とは役に立たない。 WindowsのUIコードは単にスレッドセーフではありません。他の理由はありません。 – Bill

0

ロング操作を処理する場合は別のスレッドを作成します。つまり、実行しているコードが長すぎるという問題があります。これは別のスレッドを持つコードです。

4

これが後であれば、私はthe yet to be released Visual Studio 2010で非同期エージェントAPI(プラグインしているもののプラグイン)を使用すると言っていますが、今日のツールでは、特にメッセージで作業を分けることになります必要なスレッドローカル情報がないとうまくいけば、作業を処理する別のスレッドにメッセージを渡すことができます。それを別のスレッドに渡すということは、ある種のスレッドセーフなキューにロックまたはロックフリーの状態で挿入し、他のスレッドがキューからアイテムを引き出す(または直接引き出す)ことができるイベントを設定することを意味します。効率を上げるために、スレッドプールを使用した「作業奪取キュー」を使用して見ることができます。

これは、UIスレッドがその作業の結果をペイントするなどの追加作業を行うようにするために、UIスレッドを起動して結果を確認するためにWindowsメッセージを生成する必要がありますこれを行う簡単な方法は、UIスレッドで実行する別の「作業準備完了」作業オブジェクトのキューを用意することです。 のようなキューを想像してみましょう。基本的にUIスレッドで空でないかどうかを確認できます。作業項目がある場合はインラインで実行できます。できるだけ短期間で作業することが望ましく、好ましくはを実行しないでください。はまったくブロックされません。

動きの鈍い動きがまだ見えている場合は、スレッドコールバックが16ms以上実行されていないこと、 OをUIスレッド上に作成します。これらの操作を特定するのに役立つ一連のツールがあります。最も自由に利用できるのは'windows performance toolkit'です。

関連する問題