gpt4 book ai didi

c++ - Qt - 如何从线程创建 QFuture

转载 作者:行者123 更新时间:2023-12-01 14:54:14 31 4
gpt4 key购买 nike

我目前正在开发一个编辑器程序;我需要编写一个功能,它需要使用项目的异步文件 API 连续加载多个文件,然后在加载这些文件后执行更多计算。

在另一种语言中,这可能会通过 async/await 工作流来实现,例如:

let firstFile = await FileAPI.loadFile("Foo.xxx", ...);
let otherFile = await FileAPI.loadFile("Bar/Foobar.xxx", ...);

与此代码等效的 Qt 将使用 QtConcurrent::run 生成一个新线程。 ,返回 QFuture,并等待该 future 产生结果。

但是,在我从事的项目中,文件打开 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);

这意味着我访问文件系统数据的唯一方法是调用一个发出信号的方法,该方法在另一个线程上开始计算,最终在最后发出自己的信号以传递加载的数据。

这对于上面的用例来说是非常不切实际的,因为不是说“做事情,加载数据,等待,继续做事情”,我基本上需要说“做事情,加载数据(回调'继续做事情')”并在另一个函数中“继续做事”,这在代码中引入了各种脆弱性。 (而且,你知道,这正是我们发明 future 的那种工作流程)

有什么方法可以从 loadFile 创建 QFuture 或一些 future 等效的对象(可以在方法中等待)方法,鉴于 loadFile总是在同一个工作线程上运行,我不允许创建新线程?

最佳答案

IMO,不使用现成的解决方案( AsyncFuture )并尝试从头开始重写是很奇怪的。

但我可以建议我自己的“轮子”:lambda 作为一个插槽。

void FileApi::awaitLoadFile()
{
qDebug() << "\"await\" thread is" << thread();

emit loadFile("Foo.xxx");

static bool once = connect(m_worker, &FileApiWorker::loadFileDone, this, // there is possible to avoid the third "this" parameter, but it is important to specify the lifetime of the connection and the receiver context while using lambdas
[=](QByteArray result)
{
qDebug() << "\"comeback-in-place\" thread is" << thread(); // will be the same as "await" thread was

// do what you need with your result
},
Qt::QueuedConnection // do not forget
);

qDebug() << "here is an immediate return from the \"await\" slot";
}

有用的文章 New Signal Slot Syntax - Qt Wiki

关于c++ - Qt - 如何从线程创建 QFuture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59197694/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com