【发布时间】:2020-02-04 18:13:37
【问题描述】:
我目前正在开发一个编辑器程序;我需要编写一个功能,它需要使用项目的异步文件 API 连续加载多个文件,然后在加载这些文件后执行更多计算。
在另一种语言中,这可能会使用 async/await 工作流程来实现,例如:
let firstFile = await FileAPI.loadFile("Foo.xxx", ...);
let otherFile = await FileAPI.loadFile("Bar/Foobar.xxx", ...);
与此代码等效的 Qt 将使用 QtConcurrent::run 生成一个新线程,返回一个 QFuture,并等待该未来产生结果。
但是,在我从事的项目中,文件打开 API 在单个工作线程上运行,这意味着我不能使用 QtConcurrent::run。这是代码库中一个既定的、不可协商的部分。例如,文件 API 的构造函数如下所示:
FileApiWorker* worker = new FileApiWorker();
m_workerThread = new QThread();
worker->moveToThread( m_workerThread );
// Input signals
connect( this, &FileApi::loadFile, worker, &FileApiWorker::loadFile);
connect( this, &FileApi::loadData, worker, &FileApiWorker::loadData);
connect( this, &FileApi::loadDir, worker, &FileApiWorker::loadDir);
这意味着我访问文件系统数据的唯一方法是调用一个发出信号的方法,该方法在另一个线程上开始计算,最终在最后发出自己的信号以传递加载的数据。
这对于上面的用例来说是极其不切实际的,因为我不需要说“做事,加载数据,等待,继续做事”,我本质上需要说“做事,加载数据(带有回调'继续做事” ')”和“继续做事”在另一个函数中,这在代码中引入了各种脆弱性。 (而且,嗯,你知道,这正是我们发明期货的那种工作流程)
鉴于loadFile 总是在同一个工作线程上运行,我有什么方法可以从loadFile 方法创建一个QFuture 或一些未来等效对象(可以在方法内等待)而且我不能创建新线程?
【问题讨论】:
-
你试过QEventLoop 吗?
-
您提到“在方法中等待”。这是否意味着允许阻塞事件循环?
-
谁说过关于 QtConcurrent::run 的事?底部链接的库 (github.com/benlau/asyncfuture) 展示了将“等待 X 信号”转换为
QFuture的observe函数。 -
它只是一个 Apache 2.0 许可下的单个头文件,因此您只需复制粘贴该文件即可。 (当然还有版权声明)
标签: c++ multithreading qt async-await future