c++ - 上下文 "use_current"的任务继续不起作用

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

三天前我就开始尝试寻找这个问题的答案。要么是我做错了一些根本性的错误(有一个明显的错误),要么是事情太新没有任何引用,我似乎无法理解为什么像这样的简单案例会失败。

以下代码在Windows Store应用程序中使用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 线程)。我做错了什么可怕的事吗?

在此先感谢您的帮助! :)

最佳答案

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

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

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


另请注意,如果您使用的是 fileLoaded对于跨线程通信,您需要使用 std::atomic<bool>或其他一些适当的同步对象。一个简单的bool不足以同步。

关于c++ - 上下文 "use_current"的任务继续不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863583/

相关文章:

c++ - MFC 应用程序的退出函数在哪里?

windows - 如何在 Windows 商店应用程序中处理/捕获长按

c++ - 使用 TerminateProcess 终止 "mstsc.exe"进程时出现错误代码 (5) 访问被拒绝

c++ - 求复数的指数

c++ - 复活用 Visual Studio 6 编写的项目

visual-c++ - 在 OpenGL 中的纹理顶部显示 2D 形状

windows-8 - 在 WinRT XAML 中,如何引用外部/单独程序集/项目中的图像?

windows-8 - 如何确定文件是否已在 StorageFolder 中创建

c++ - C++ 数组与 std::vector 和 std::array 的效率

c++ - 在注入(inject)进程中从 DLL 调用函数