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

时间:2018-07-11 11:01:24

标签: c++ qt qfuture qfuturewatcher

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

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

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

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

线程完成后,我用finished捕获了信号QfutureWatcher

这是我的渲染功能:

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变量,但是我不知道如何避免它。

1 个答案:

答案 0 :(得分:1)

停止尝试手动管理内存,而是使用适合您用例的智能指针。由于您使用的是无意识移动public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper() .registerModule(new JavaTimeModule()) .disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS); Entity entity = new Entity(Instant.now()); StringWriter writer = new StringWriter(); objectMapper.writeValue(writer, entity); System.out.println(writer.getBuffer()); } @lombok.Value static class Entity { Instant timestamp; } ,因此将需要QFuture。一旦std::shared_ptr / QFuture超出范围,并且您不再拥有QFutureWatcher实例,该资源将被删除。因此,在您的情况下,您的shared_ptr函数应返回一个render。将所有权从QList<std::shared_ptr<AeGraphicsItem>>转移到例如{ shared_ptr:所有权转移时,您必须QGraphicsScene的{​​{1}}。

请注意,您的release接连shared_ptr的检查从根本上来说是有缺陷的:将来可能会在您致电isRunning时运行,但在您致电cancel时才能完成。如果要取消它,只需致电isRunning。另外请注意,您无法有意义地取消cancel返回的cancel,因此您所做的事情本身就是非常错误的。