void QgsMapRendererParallelJob::cancel() { if ( !isActive() ) return; QgsDebugMsg( QString( "PARALLEL cancel at status %1" ).arg( mStatus ) ); mLabelingRenderContext.setRenderingStopped( true ); for ( LayerRenderJobs::iterator it = mLayerJobs.begin(); it != mLayerJobs.end(); ++it ) { it->context.setRenderingStopped( true ); } if ( mStatus == RenderingLayers ) { disconnect( &mFutureWatcher, SIGNAL( finished() ), this, SLOT( renderLayersFinished() ) ); mFutureWatcher.waitForFinished(); renderLayersFinished(); } if ( mStatus == RenderingLabels ) { disconnect( &mLabelingFutureWatcher, SIGNAL( finished() ), this, SLOT( renderingFinished() ) ); mLabelingFutureWatcher.waitForFinished(); renderingFinished(); } Q_ASSERT( mStatus == Idle ); }
void QgsMapRendererParallelJob::waitForFinished() { if ( !isActive() ) return; if ( mStatus == RenderingLayers ) { disconnect( &mFutureWatcher, SIGNAL( finished() ), this, SLOT( renderLayersFinished() ) ); QTime t; t.start(); mFutureWatcher.waitForFinished(); QgsDebugMsg( QString( "waitForFinished (1): %1 ms" ).arg( t.elapsed() / 1000.0 ) ); renderLayersFinished(); } if ( mStatus == RenderingLabels ) { disconnect( &mLabelingFutureWatcher, SIGNAL( finished() ), this, SLOT( renderingFinished() ) ); QTime t; t.start(); mLabelingFutureWatcher.waitForFinished(); QgsDebugMsg( QString( "waitForFinished (2): %1 ms" ).arg( t.elapsed() / 1000.0 ) ); renderingFinished(); } Q_ASSERT( mStatus == Idle ); }
void QgsMapRendererParallelJob::start() { if ( isActive() ) return; mRenderingStart.start(); mStatus = RenderingLayers; delete mLabelingEngine; mLabelingEngine = nullptr; delete mLabelingEngineV2; mLabelingEngineV2 = nullptr; if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) ) { #ifdef LABELING_V2 mLabelingEngineV2 = new QgsLabelingEngineV2(); mLabelingEngineV2->readSettingsFromProject(); mLabelingEngineV2->setMapSettings( mSettings ); #else mLabelingEngine = new QgsPalLabeling; mLabelingEngine->loadEngineSettings(); mLabelingEngine->init( mSettings ); #endif } mLayerJobs = prepareJobs( nullptr, mLabelingEngine, mLabelingEngineV2 ); // prepareJobs calls mapLayer->createMapRenderer may involve cloning a RasterDataProvider, // whose constructor may need to download some data (i.e. WMS, AMS) and doing so runs a // QEventLoop waiting for the network request to complete. If unluckily someone calls // mapCanvas->refresh() while this is happening, QgsMapRendererCustomPainterJob::cancel is // called, deleting the QgsMapRendererCustomPainterJob while this function is running. // Hence we need to check whether the job is still active before proceeding if ( !isActive() ) return; QgsDebugMsg( QString( "QThreadPool max thread count is %1" ).arg( QThreadPool::globalInstance()->maxThreadCount() ) ); // start async job connect( &mFutureWatcher, SIGNAL( finished() ), SLOT( renderLayersFinished() ) ); mFuture = QtConcurrent::map( mLayerJobs, renderLayerStatic ); mFutureWatcher.setFuture( mFuture ); }
void QgsMapRendererParallelJob::start() { if ( isActive() ) return; mRenderingStart.start(); mStatus = RenderingLayers; delete mLabelingEngine; mLabelingEngine = nullptr; delete mLabelingEngineV2; mLabelingEngineV2 = nullptr; if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) ) { #ifdef LABELING_V2 mLabelingEngineV2 = new QgsLabelingEngineV2(); mLabelingEngineV2->readSettingsFromProject(); mLabelingEngineV2->setMapSettings( mSettings ); #else mLabelingEngine = new QgsPalLabeling; mLabelingEngine->loadEngineSettings(); mLabelingEngine->init( mSettings ); #endif } mLayerJobs = prepareJobs( nullptr, mLabelingEngine, mLabelingEngineV2 ); QgsDebugMsg( QString( "QThreadPool max thread count is %1" ).arg( QThreadPool::globalInstance()->maxThreadCount() ) ); // start async job connect( &mFutureWatcher, SIGNAL( finished() ), SLOT( renderLayersFinished() ) ); mFuture = QtConcurrent::map( mLayerJobs, renderLayerStatic ); mFutureWatcher.setFuture( mFuture ); }