2012-03-05 3 views
3

非常に短い話ですが、私はWinFormsパネルとそれを別のスレッドで描画するアンマネージドクラスのインスタンスを配置する必要があります。 SDKは、何を描画するかを考え出すのに数秒かかることがありますが、これを実行している間にUIスレッドがブロックされます)。私は実際にこれらの多く(32まで)が必要ですが、私たちは今のところただ一つ話します。そのコンセプトは、必要な回数だけ複製することができなければなりません。フォームのネストされたコントロールの複数のメッセージループを作成する

私がする必要があると思うのは、新しいスレッドを開始してPanelを「新規作成」し、特に何かに縛られていないApplicationContextを開始し、パネルに割り当てることです。次に、Panelクラスには、ApplicationContextを終了させ、メッセージポンプをシャットダウンし、スレッドを終了させるDispose()オーバーロードが必要です。私が知っている必要があり何

は次のとおりです。

  • パネルはいるIContainer内部に配置された、または任意の親オブジェクトのControlsコレクションに追加することはできますか?または、スレッドセーフでない呼び出しが行われる原因になりますか?
  • 新しいスレッドで新しいインスタンスを作成するクラスには、静的なファクトリメソッドがあります。メソッドからバックグラウンドスレッドで作成されたPanelへの参照を返す必要があるので、私はそれを扱うことができます。バックグラウンドスレッドによって設定される静的メソッドでローカルに定義された変数のwhile/sleepループで待機するよりも良い方法がありますか?
  • Panelを所有するスレッドへの参照を保持する必要がありますか?
  • 私はこれを試してみるのは難しいですか?

答えて

6

このように問題に近づけないでください。描画スレッドをメモリ内のイメージに描画し、UIスレッドでそれらのイメージをパネルに描画させる必要があります。描画スレッドが反復ごとに新しいイメージを生成する場合、UIスレッドは新しいイメージが使用可能になるたびにイメージをキャッシュして置き換えることができます。予想されるスレッドの振る舞いを奪うのではなく、後で多くの頭痛を緩和します。

+3

+1:これは「オフスクリーン合成」と呼ばれます。ほとんどのアプリケーションで使用され、UIの応答性とちらつきのないようにしながら、画像を読み込むのに時間がかかります。これには、ゲームエンジンからブラウザまでのすべてが含まれます。 – NotMe

+0

良いアイデア。しかし、私はその贅沢はないと思う。 SDKはHWndが引き寄せられることを期待しているので、私はWindowsに知られているGUI要素を与える必要があると確信しています。 – KeithS

関連する問題