2016-07-30 60 views
0

我有一个工作线程在整个运行时期间运行,它们生成事件。如何从UI线程访问工作线程?

我可以使用disp = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher在UI线程内处理这些事件。

更确切地说,我通过在工作线程中的任何地方使用disp->RunAsync(...)来修改UI。

但我不知道如何做倒置操作。我想在UI线程内部有一些Async函数来在工作线程中执行操作(在某些std::unique_ptr上),当我单击某个按钮时。

+0

UI线程是特殊的,它有一个解决[生产者 - 消费者调度员问题](https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem)。它允许你在该线程上运行代码。如果你想在工作线程上做到这一点,那么你需要解决同样的问题。线程安全队列是必需的。 –

回答

0

如果我理解正确,您希望能够在单击按钮时运行异步操作,但在您引用为您的工作线程的特定线程上运行异步操作。

首先 - 既然您想在2个线程中使用资源,您不应该使用unique_ptr并使用shared_ptr,因为您在两个线程之间共享此资源。

其次 - 如果您不一定必须在特定线程上运行该操作,则可以简单地使用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页面显示实现模式的一种方式,并且可以使用WinRT的组成部分,使之更好\更conveniant \更熟悉

+0

实际上我只使用一个工作线程,我通过使用一个队列列表来解决问题。订单从UI线程发送并在工作线程中执行。 –