使用上下文"use_current"的任务继续不起作用
Task continuation with context "use_current" does not work
从三天前开始,我就一直在寻找这个问题的答案。要么是我做了一些根本错误的事情(有一个明显的错误),要么是这件事太新了,没有任何参考,我似乎不明白为什么像这样的简单案例会失败。
以下代码在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应用商店C++应用程序(例如Direct2D应用程序)中的任何位置,但它会失败(我已经把它放在"DirectXPage::DirectXPage"构造函数体中,我希望它是主UI线程)。我做错了什么吗?
提前感谢您的帮助!:)
由于您在UI线程上调用.then()
,use_current()
将导致继续操作被安排在UI线程中执行。
但是,在UI线程空闲之前(即,当它不做任何工作时),该延续无法运行。但是,在您的示例中,UI线程从来都不是免费的:DirectXPage
构造函数正在UI线程上运行。DirectXPage
构造函数在continuation执行之前不会返回,而continuation在DirectXPage
构造函数返回之前无法执行。
您需要允许构造函数返回,以便UI线程可以自由地执行其他工作(如执行延续)。
还要注意,如果使用fileLoaded
进行跨线程通信,则需要使用std::atomic<bool>
或其他适当的同步对象。一个简单的bool
不足以进行同步。
- 循环后如何继续阅读
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- 有没有任务栏API可以立即应用注册表更改
- C++:继续创建新的变量可以吗
- 如何创建线程序列以按照启动顺序执行任务?
- C++一个线程如何正确通信其任务已完成?
- 在线程之间拆分任务总是值得的吗?
- 递归求和任务的错误答案
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- C++ 任务流库入门
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- C++ 如何暂停控制台输出,以便用户可以在继续之前阅读信息
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 编写一个读取五个整数并执行一些任务的C++程序
- 任务内部的 OpenMP 任务循环
- 使用 UWP 中的 IAsyncOperation 继续执行任务
- 使用上下文"use_current"的任务继续不起作用
- C++ Metro 应用程序教程的编译错误 - 任务继续