From 1b9f41d03d06fc03ad703f7eeccaf2fd3baa5565 Mon Sep 17 00:00:00 2001 From: nirvn Date: Wed, 4 Apr 2018 15:35:33 +0700 Subject: [PATCH] Insure canvas rendering jobs are cancelled when exiting QGIS --- src/app/qgisapp.cpp | 8 ++++++-- src/gui/qgsmapcanvas.cpp | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 683031a5a1e..b16a294a2df 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -1362,8 +1362,6 @@ QgisApp::QgisApp() QgisApp::~QgisApp() { - stopRendering(); - delete mInternalClipboard; delete mQgisInterface; delete mStyleSheetBuilder; @@ -1452,6 +1450,12 @@ QgisApp::~QgisApp() qDeleteAll( mCustomDropHandlers ); qDeleteAll( mCustomLayoutDropHandlers ); + const QList canvases = mapCanvases(); + for ( QgsMapCanvas *canvas : canvases ) + { + delete canvas; + } + // This function *MUST* be the last one called, as it destroys in // particular GDAL. As above objects can hold GDAL/OGR objects, it is not // safe destroying them afterwards diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp index 40333065ece..72f7c5b6af0 100644 --- a/src/gui/qgsmapcanvas.cpp +++ b/src/gui/qgsmapcanvas.cpp @@ -211,6 +211,16 @@ QgsMapCanvas::~QgsMapCanvas() delete mJob; } + QList< QgsMapRendererQImageJob * >::const_iterator previewJob = mPreviewJobs.constBegin(); + for ( ; previewJob != mPreviewJobs.constEnd(); ++previewJob ) + { + if ( *previewJob ) + { + whileBlocking( *previewJob )->cancel(); + delete *previewJob; + } + } + // delete canvas items prior to deleting the canvas // because they might try to update canvas when it's // already being destructed, ends with segfault