私はオプションウィンドウと、これらのオプションとKinectデータに基づいて色を表示するウィンドウを持っています。これまでのところすべてが1つのスレッド上にあります(私が知る限り、私はスレッドを実行していません)。新しいスレッドでウィンドウを開くにはどうすればよいですか?
ここで、可能な限り低いレイテンシーで更新する必要があるビューアウィンドウを開くオプションを追加します。これはすべてのウィンドウを作成し、それを見せている伴い:
viewer = new SkeletalViewer.MainWindow();
viewer.Show();
このイベントは、火災、色ウィンドウが(メインスレッド上で1秒間に30回の発射すなわち、イベントが発火を停止)色を表示停止しますが、ビューア完全に表示されます。ビューアとカラーウィンドウの両方を更新したい。
他の質問を読むことから、解決策は新しいスレッドでビューアを作成するように思えます。しかし、私はこれに多くの問題に遭遇しています。
この火災私はビューアを開くためのボタンをクリックします。
private void launchViewerThread_Click(object sender, RoutedEventArgs e)
{
Thread viewerThread = new Thread(delegate()
{
viewer = new SkeletalViewer.MainWindow();
viewer.Dispatcher.Invoke(new Action(delegate()
{
viewer.Show();
}));
});
viewerThread.SetApartmentState(ApartmentState.STA); // needs to be STA or throws exception
viewerThread.Start();
}
は関係なく、私は上記のようにviewer.Show()または呼び出し()を呼び出した場合の、行は例外をスロー:はできませんその親Freezableとは異なるスレッドに属するDependencyObjectを使用します。ここで私はInvoke()を理解しています:それは、オブジェクトが実行されているスレッドを知っているビューアのディスパッチャにアクセスし、そのスレッドからメソッドを呼び出すことができます。
新しいスレッドにこのビューアを配置する必要がありますか?問題はスレッドの問題なのでしょうか?ユーザーは視聴者と対話しません。
これはなぜ機能しないのですか?助けてくれてありがとう。
Show()がビューアのスレッドで呼び出されていることを保証するものとしてInvokeを参照してください。 viewer.Show()の周りのInvoke()がなくても、私はまだFreezableの例外を受け取ります。 –
@ michael.greenwaldその後、例外を引き起こしている何かが 'SkeletalViewer.MainWindow()'にあります。私は上に示したものをまったく実行する空のWPFプロジェクトを構築しましたが、例外なく実行されます。たぶんあなたは問題をこの質問からの似ている:http://stackoverflow.com/questions/3636761/how-to-debug-this-error-when-none-of-my-code-shows-up-in- the-stack – shf301
そして 'launchViewerThread'からそのウィンドウを閉じるには? –