gpt4 book ai didi

c++ - 在取消线程上使用 QFuture 释放内存

转载 作者:行者123 更新时间:2023-11-30 04:59:17 24 4
gpt4 key购买 nike

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

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

if (future.isRunning()) {
future.cancel();
}

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

线程完成后,我收到信号 finishedQfutureWatcher .

这是我的渲染函数:

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 被取消时,我如何销毁这个列表?我明白在我的代码中我正在重新定义 future变量,但我不知道如何避免它。

最佳答案

停止尝试手动管理内存,而是使用适合您的用例的智能指针。因为你使用 move-unaware QFuture , 你需要一个 std::shared_ptr .一旦QFuture/QFutureWatcher超出范围,您不再拥有shared_ptr实例,资源将被删除。所以在你的情况下你的 render函数应返回 QList<std::shared_ptr<AeGraphicsItem>> .从 shared_ptr 转移所有权时要小心例如一个QGraphicsScene :你必须 release来自 shared_ptr关于所有权转让。

请注意您的 isRunning检查后跟 cancel存在根本性缺陷:当您调用 isRunning 时, future 可能正在运行但在您调用 cancel 时完成.如果您想取消它,只需调用cancel即可。 .另请注意,您不能有意义地取消 QFutureQtConcurrent::run 返回所以你所做的事情本身就非常非常错误。

关于c++ - 在取消线程上使用 QFuture 释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51283838/

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