上下文“use_current”的任务继续不起作用

时间:2012-10-12 16:44:13

标签: c++ visual-c++ windows-8 windows-runtime ppl

三天前我一直试着寻找答案。要么我做了一些从根本上说错误的事情(这是一个明显的错误),要么事情太新了,没有任何参考,我似乎无法理解为什么像这样的简单案例会失败。

以下代码在Windows应用商店应用程序中使用C ++中的PPL任务库,模拟在打开循环之前需要2秒的文件加载操作(当然这是为了说明最小代码的问题,真正的循环确实如此)其他渲染也可以显示进度。)

如果我使用“use_current”作为延续上下文,则永远不会调用代码的延续部分(即“fileLoaded = true”):

bool fileLoaded = false;
while (!fileLoaded)
{
    concurrency::task<void>([this]()
    {
        // Simulate file load delay
        concurrency::wait(2000);

    }).then([this, &fileLoaded]()
    {
        fileLoaded = true; // This never gets executed!

        // If the following is changed to "use_default" or 
        // "use_arbitrary", then this continuation gets called.
    }, concurrency::task_continuation_context::use_current());

    concurrency::wait(50);
}

如果我使用“use_default”或“use_arbitrary”,并且将“fileLoad”正确设置为“true”,则相同的代码可以正常工作。这段代码可以放在Windows Store C ++应用程序的任何地方(例如Direct2D应用程序),它会失败(我把它放在“DirectXPage :: DirectXPage”构造函数体中,我希望它是主UI线程)。我做了一件可怕的错事吗?

提前感谢您的帮助! :)

1 个答案:

答案 0 :(得分:6)

由于您在UI线程上调用.then()use_current()将导致继续安排在UI线程上执行。

但是,在UI线程空闲之前(即,当它没有做任何工作时),该延续不能运行。但是,在您的示例中,UI线程永远不会自由:DirectXPage构造函数正在UI线程上运行。在继续执行之前,DirectXPage构造函数不会返回,并且在DirectXPage构造函数返回之前,继续执行无法执行。

您需要允许构造函数返回,以便UI线程可以自由地执行其他工作(例如执行延续)。


另请注意,如果您使用fileLoaded进行跨线程通信,则需要使用std::atomic<bool>或其他正确的同步对象。简单的bool不足以进行同步。

相关问题