如何从UI线程访问工作线程?

时间:2016-07-30 01:17:34

标签: multithreading xaml c++-cx worker ui-thread

我有一个在运行时运行的工作线程,它生成事件。

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

更确切地说,我在工作线程内的任何地方使用disp->RunAsync(...)对UI进行了修改。

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

1 个答案:

答案 0 :(得分:0)

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

首先 - 由于您希望在2个线程中使用资源,因此您不应使用ln(0)并使用unique_ptr,因为您在两个线程之间共享此资源。

第二 - 如果您不一定要在特定主题上运行该操作,那么您只需使用Windows::System::Threading::ThreadPool::RunAsync并按值捕获shared_ptr

例如:

shared_ptr

如果您必须在特定线程上运行该操作,那么我假设您希望能够将操作附加到已经运行的线程,否则您正在创建一个线程,您可以使用上面的示例。 因此,为了将操作附加到已经运行的线程,该线程必须具有获取新操作然后以同步顺序运行这些操作的功能。此功能基本上是Dispatcher提供的功能。这就是Event Loop,也称为:消息调度程序,消息循环,消息泵或运行循环。您也可以通过阅读Recator \ Proactor设计模式来查找信息。

This CodeProject页面显示了实现模式的一种方法,您可以使用Winrt组件使其更好\更方便\更熟悉