2011-01-25 1 views
4

C#Windowsアプリケーションで2つのUIスレッドを実装するにはどうすればよいですか?C#windowsアプリケーションで2つのUIスレッドアプリケーション

+3

@Joey:WinForms/WPFコントロールはスレッドアフィニティを持っていますが、コントロールを共有しない限り、実際には複数のUIスレッドを持つことができます。 –

+0

@ジョイ:それはおそらく彼がなぜそれについての情報がほとんどないのでここで尋ねているのか一般的ではありません。 WPFでは、アプリケーションがシングルトンであることが強制され、メインスレッドとの親和性があるという事実のために、私はそれが可能であるとは考えていません。 – Josh

答えて

7

スレッドを開始する前にスレッドをSTAに切り替えるには、Thread.SetApartmentState()を呼び出す必要があります。そして、そのスレッド上に作成されたウィンドウを生き残らせるためにメッセージループをポンピングしてください.Application.Run()。 Application.ExitThread()はメッセージループを終了し、スレッドを終了させます。実行(フォーム)を使用すると、メインスレッドと同様に自動的に実行されます。

しかし、ユーザーは、そのスレッドで作成したウィンドウを扱うのに苦労するかもしれません。メインスレッドのウィンドウとZオーダーの関係はなく、デスクトップはその親です。それはあなた自身のものを含め、別のウィンドウの後ろに簡単に迷子になる傾向があります。そのための厄介な回避策は、TopMostであり、SetParent()をピンポイントすることです。

5

これは答えではありませんが、それ以上の説明です。

同時に2つのスレッドが同じピクセルにアクセスすることが許可されている場合(マルチスレッドUIの結果である場合)、スレッド間で何らかの並べ替えが必要です。スレッドが同期しなかった場合、ピクセルの色をどのように決定する必要がありますか?

ロックを追加する必要があります。 1ピクセルあたりのロックは非常にコストがかかるので、すぐにコントロールごとまたはウィンドウごとのロックに移行します。そこに行く:私たちはロックを実装しているUIにアクセスするために1つだけのスレッドを許可します。

BTW:ピクセルをcontrolまたはcontroltreeに置き換えます。それが画素であろうとコントロールであろうと、共有されているデータに関するピクセルだけではありません。

1

新しいスレッドでApplication.Run(...)を呼び出し、独自のメッセージループでフォームを開きます。

new Thread(() => Application.Run(someForm)).Start(); 
関連する問題