これが後であれば、私はthe yet to be released Visual Studio 2010で非同期エージェントAPI(プラグインしているもののプラグイン)を使用すると言っていますが、今日のツールでは、特にメッセージで作業を分けることになります必要なスレッドローカル情報がないとうまくいけば、作業を処理する別のスレッドにメッセージを渡すことができます。それを別のスレッドに渡すということは、ある種のスレッドセーフなキューにロックまたはロックフリーの状態で挿入し、他のスレッドがキューからアイテムを引き出す(または直接引き出す)ことができるイベントを設定することを意味します。効率を上げるために、スレッドプールを使用した「作業奪取キュー」を使用して見ることができます。
これは、UIスレッドがその作業の結果をペイントするなどの追加作業を行うようにするために、UIスレッドを起動して結果を確認するためにWindowsメッセージを生成する必要がありますこれを行う簡単な方法は、UIスレッドで実行する別の「作業準備完了」作業オブジェクトのキューを用意することです。 のようなキューを想像してみましょう。基本的にUIスレッドで空でないかどうかを確認できます。作業項目がある場合はインラインで実行できます。できるだけ短期間で作業することが望ましく、好ましくはを実行しないでください。はまったくブロックされません。
動きの鈍い動きがまだ見えている場合は、スレッドコールバックが16ms以上実行されていないこと、 OをUIスレッド上に作成します。これらの操作を特定するのに役立つ一連のツールがあります。最も自由に利用できるのは'windows performance toolkit'です。
...なぜですか?私はすでにキューを持っていますが、確かに別のものを作成するのではなく、ちょうどそれを再利用するいくつかの、ドロー的な、半分の文書化された、恐ろしく複雑な手段があります。 – Shog9
それはやっかいなことがあっても、Markさんのように問題を適切に処理する方法ではありません。 ウィンドウのサイズ変更などの問題が発生した場合は、WM_SIZEを処理するコードのように見えます。 –
「そうそう、狂気がある」とは役に立たない。 WindowsのUIコードは単にスレッドセーフではありません。他の理由はありません。 – Bill