首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在取消线程上使用QFuture释放内存

在取消线程上使用QFuture释放内存
EN

Stack Overflow用户
提问于 2018-07-11 11:01:23
回答 1查看 629关注 0票数 2

我正在编写一个使用QtConcurrent启动线程的程序。在我的例子中,当我使用鼠标滚动时,我使用它来呈现一个QGraphicsView。

我使用以下代码启动线程:

代码语言:javascript
复制
if (future.isRunning()) {
    future.cancel();
}

future = QtConcurrent::run(this,&AeVectorLayer::render, renderparams, pos);
watcher.setFuture(future);

当线程完成时,我用一个finished捕获信号QfutureWatcher

这是我的渲染功能:

代码语言:javascript
复制
QList<AeGraphicsItem*> AeVectorLayer::render(Ae::renderParams renderparams, int pos)
{
    AeVectorHandler *coso = new AeVectorHandler();
    coso->openDataset(AeLayer::absoluteFilePath);
    coso->setTransformCoordinates(myEPSG);
    QList<AeGraphicsItem*> bla = coso->getItems(renderparams.sceneRect.x(), 
    renderparams.sceneRect.y(), renderparams.sceneRect.width(), 
    renderparams.sceneRect.height(), renderparams.zoom, color, this);
    for (int i = 0; i < bla.size(); i++)
        bla.at(i)->setZValue((qreal)pos);
    delete coso;
    return bla;
}

如您所见,我的呈现函数中有一个QList<QGraphicsItem*>。当未来被取消时,我怎样才能毁掉这份清单?我发现,在我的代码中,我正在重新定义future变量,但我不知道如何避免它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-12 07:08:55

停止手动管理内存,而使用适合您的用例的智能指针。因为您使用的是不了解移动的QFuture,所以需要一个std::shared_ptr。一旦QFuture/QFutureWatcher超出范围,并且不再保存shared_ptr实例,资源将被删除。因此,在您的示例中,render函数应该返回一个QList<std::shared_ptr<AeGraphicsItem>>。当您将所有权从shared_ptrs转移到例如QGraphicsScene时要小心:您必须在所有权转移时从shared_ptr转移release

请注意,isRunning检查后面跟着cancel是有根本缺陷的:未来可能在调用isRunning时运行,但在调用cancel时完成。如果你想取消它,只需打电话给cancel。还请注意,您不能有意义地取消QtConcurrent::run返回的QtConcurrent::run,因此您所做的工作本身是非常错误的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51283838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档