PPL任务 - 在桌面应用程序的UI线程中继续

时间:2014-06-13 07:09:28

标签: c++ multithreading mfc ppl

我想使用ppl任务在后台完成一些工作,完成后,在窗口中显示结果。在我的例子中,UI框架是MFC。结构将是:

using namespace concurrency;

create_task([] {
    // this can be run in any thread, shouldn't be the UI thread
    // do real work here
    return 42;
}).then([](int n)
{
    // this should be run on the UI thread
    // ... open a MFC window to display results
});

问题是,非Windows应用商店应用不允许指定task_continuation_context。相反,运行时决定使用哪个上下文(请参阅task_continuation_context Class)。 我可以依赖运行时来可靠地确定它需要在UI线程上运行延续吗?是否有合理的解决方法来实现我想要的 - 不阻止UI线程?


更新:玩游戏表明运行时不会在UI线程上运行延续。那么,这不可能吗?

1 个答案:

答案 0 :(得分:0)

我要解决的问题是创建一个Dispatcher类和一个仅消息窗口,它是Dispatcher的成员。必须从主线程构造Dispatcher(我使用单例),以便主线程处理发送到仅消息窗口的消息。我可以将std::function传递给我的Dispatcher::ExecuteInMainThread函数。然后,Dispatcher将在仅消息窗口上调用SendMessage,将指针(不幸的是只有一个指针)传递给std::function。我在仅消息窗口中需要的唯一消息处理程序将调用我传入的函数 - 在主线程内。

可以在任务继续中使用此Dispatcher在主线程中执行std::function