如何从 UI 线程访问工作线程?
how to access a worker thread from UI thread?
我在整个运行时都有一个工作线程 运行,它生成事件。
我可以使用 disp = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher
.
在 UI 线程中处理这些事件
更准确地说,我通过在工作线程内的任何位置使用 disp->RunAsync(...)
对 UI 进行修改。
但我不知道如何进行反转操作。当我点击某个按钮时,我想在 UI 线程中有一些异步函数来在工作线程中执行操作(在某些 std::unique_ptr
上)。
如果我理解正确,您希望能够 运行 在单击按钮时执行异步操作,但是在您称为工作线程的特定线程上。
首先 - 因为你想在 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();
}));
如果您必须 运行 特定线程上的操作,那么我假设您希望能够将操作附加到已经 运行ning 线程,否则您将创建一个线程并且你可以使用上面的例子。
因此,为了将操作附加到已经 运行ning 的线程,该线程必须具有获取新操作的功能,然后 运行ing 这些操作以同步顺序进行。此功能基本上是 Dispatcher 提供的功能。这就是 Event Loop,也称为:消息调度程序、消息循环、消息泵或 运行 循环。您还可以通过阅读 Recator\Proactor 设计模式来查找信息。
This CodeProject页面显示了一种实现模式的方法,您可以使用Winrt组件使其更好\更方便\更熟悉
我在整个运行时都有一个工作线程 运行,它生成事件。
我可以使用 disp = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher
.
更准确地说,我通过在工作线程内的任何位置使用 disp->RunAsync(...)
对 UI 进行修改。
但我不知道如何进行反转操作。当我点击某个按钮时,我想在 UI 线程中有一些异步函数来在工作线程中执行操作(在某些 std::unique_ptr
上)。
如果我理解正确,您希望能够 运行 在单击按钮时执行异步操作,但是在您称为工作线程的特定线程上。
首先 - 因为你想在 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();
}));
如果您必须 运行 特定线程上的操作,那么我假设您希望能够将操作附加到已经 运行ning 线程,否则您将创建一个线程并且你可以使用上面的例子。 因此,为了将操作附加到已经 运行ning 的线程,该线程必须具有获取新操作的功能,然后 运行ing 这些操作以同步顺序进行。此功能基本上是 Dispatcher 提供的功能。这就是 Event Loop,也称为:消息调度程序、消息循环、消息泵或 运行 循环。您还可以通过阅读 Recator\Proactor 设计模式来查找信息。
This CodeProject页面显示了一种实现模式的方法,您可以使用Winrt组件使其更好\更方便\更熟悉