2016-07-30 10 views
0

イベントを生成するランタイムに沿って動作するスレッドがあります。UIスレッドからワーカースレッドにアクセスする方法は?

disp = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcherを使用して、UIスレッド内でこれらのイベントを処理できます。

もっと正確に言えば、作業スレッド内のどこにいてもdisp->RunAsync(...)を使用してUIの変更を行います。

しかし、逆の操作を行う方法はわかりません。私はいくつかのボタンをクリックすると、作業スレッド内の操作(一部ではstd::unique_ptr)を実行するUIスレッド内にいくつかの非同期関数を持っています。

+0

より身近よりconveniantの\ \それを改善するためにWinRTのコンポーネントを使用することができますUIスレッドが特別である、それは[生産者 - 消費者を解決し、ディスパッチャを持っています問題](https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem)。これにより、そのスレッドでコードを実行することができます。ワーカースレッド上でこれを実行したい場合は、同じ問題を解決する必要があります。スレッドセーフなキューが必要です。 –

答えて

0

私が正しく理解しているのであれば、ボタンをクリックしたときに非同期操作を実行できるようにしたいのですが、ワーカースレッドとして参照する特定のスレッドで実行することができます。

ファースト - リソースを2つのスレッドで使用する場合は、unique_ptrを使用しないでください.2つのスレッド間でこのリソースを共有するため、shared_ptrを使用してください。

第2に、特定のスレッドでアクションを実行する必要がない場合は、単にWindows::System::Threading::ThreadPool::RunAsyncを使用し、値でshared_ptrをキャプチャするだけです。

は、例えば:あなたが特定のスレッドで操作を実行しなければならない場合に

namespace WST = Windows::System::Threading; 

WST::ThreadPool::RunAsync(
    ref new WST::WorkItemHandler(
      [mySharedPtr](Windows::Foundation::IAsyncAction^ operation) 
      { 
       mySharedPtr->Foo(); 
      })); 

が、私はそうあなたがスレッドを作成している、あなたはすでに実行中のスレッドに操作を追加できるようにしたいと仮定し、上記の例を使用することができます。 したがって、既に実行中のスレッドに操作を追加するには、そのスレッドに新しい操作を取得して、その操作を同期した順序で実行する機能が必要です。この機能は基本的にDispatcherが提供する機能です。これは、メッセージディスパッチャ、メッセージループ、メッセージポンプ、または実行ループとも呼ばれるEvent Loopです。また、Recator \ Proactorデザインパターンを読んで情報を見つけることもできます。

This CodeProjectページには、パターンを実装する1つの方法を示しており、あなたが

+0

私は実際には1つのワークスレッドしか使用しません。問題のキューリストを使用して問題を解決しました。注文はUIスレッドから送信され、作業スレッドで実行されます。 –

関連する問題