Skip to content

Commit d0171eb

Browse files
committedDec 7, 2022
Make raster paletted renderer classify function thread safe
In addition to making this correctly thread safe, also avoids a temporary UI hang during the classification if the layer rendering is triggered before the classification finishes.
1 parent 059f02a commit d0171eb

File tree

2 files changed

+21
-20
lines changed

2 files changed

+21
-20
lines changed
 

‎src/gui/raster/qgspalettedrendererwidget.cpp

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include "qgscolordialog.h"
2323
#include "qgssettings.h"
2424
#include "qgsproject.h"
25-
#include "qgscolorrampshaderwidget.h"
2625
#include "qgscolorrampimpl.h"
2726
#include "qgslocaleawarenumericlineeditdelegate.h"
2827

@@ -840,7 +839,7 @@ void QgsPalettedRendererModel::deleteAll()
840839
//
841840

842841
QgsPalettedRendererClassGatherer::QgsPalettedRendererClassGatherer( QgsRasterLayer *layer, int bandNumber, const QgsPalettedRasterRenderer::ClassData &existingClasses, QgsColorRamp *ramp )
843-
: mLayer( layer )
842+
: mProvider( ( layer && layer->dataProvider() ) ? layer->dataProvider()->clone() : nullptr )
844843
, mBandNumber( bandNumber )
845844
, mRamp( ramp )
846845
, mClasses( existingClasses )
@@ -855,28 +854,31 @@ void QgsPalettedRendererClassGatherer::run()
855854
mFeedback = new QgsRasterBlockFeedback();
856855
connect( mFeedback, &QgsRasterBlockFeedback::progressChanged, this, &QgsPalettedRendererClassGatherer::progressChanged );
857856

858-
QgsPalettedRasterRenderer::ClassData newClasses = QgsPalettedRasterRenderer::classDataFromRaster( mLayer->dataProvider(), mBandNumber, mRamp.get(), mFeedback );
859-
860-
// combine existing classes with new classes
861-
QgsPalettedRasterRenderer::ClassData::iterator classIt = newClasses.begin();
862-
emit progressChanged( 0 );
863-
qlonglong i = 0;
864-
for ( ; classIt != newClasses.end(); ++classIt )
857+
if ( mProvider )
865858
{
866-
// check if existing classes contains this same class
867-
for ( const QgsPalettedRasterRenderer::Class &existingClass : std::as_const( mClasses ) )
859+
QgsPalettedRasterRenderer::ClassData newClasses = QgsPalettedRasterRenderer::classDataFromRaster( mProvider.get(), mBandNumber, mRamp.get(), mFeedback );
860+
861+
// combine existing classes with new classes
862+
QgsPalettedRasterRenderer::ClassData::iterator classIt = newClasses.begin();
863+
emit progressChanged( 0 );
864+
qlonglong i = 0;
865+
for ( ; classIt != newClasses.end(); ++classIt )
868866
{
869-
if ( existingClass.value == classIt->value )
867+
// check if existing classes contains this same class
868+
for ( const QgsPalettedRasterRenderer::Class &existingClass : std::as_const( mClasses ) )
870869
{
871-
classIt->color = existingClass.color;
872-
classIt->label = existingClass.label;
873-
break;
870+
if ( existingClass.value == classIt->value )
871+
{
872+
classIt->color = existingClass.color;
873+
classIt->label = existingClass.label;
874+
break;
875+
}
874876
}
877+
i ++;
878+
emit progressChanged( 100 * ( i / static_cast<float>( newClasses.count() ) ) );
875879
}
876-
i ++;
877-
emit progressChanged( 100 * ( i / static_cast<float>( newClasses.count() ) ) );
880+
mClasses = newClasses;
878881
}
879-
mClasses = newClasses;
880882

881883
// be overly cautious - it's *possible* stop() might be called between deleting mFeedback and nulling it
882884
mFeedbackMutex.lock();

‎src/gui/raster/qgspalettedrendererwidget.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
#include "qgspalettedrasterrenderer.h"
2424
#include "qgscolorschemelist.h"
2525
#include "qgsrasterlayer.h"
26-
#include "qgsrasterdataprovider.h"
2726
#include "ui_qgspalettedrendererwidgetbase.h"
2827
#include "qgis_gui.h"
2928

@@ -81,7 +80,7 @@ class QgsPalettedRendererClassGatherer: public QThread
8180

8281
private:
8382

84-
QgsRasterLayer *mLayer = nullptr;
83+
std::unique_ptr< QgsRasterDataProvider > mProvider;
8584
int mBandNumber;
8685
std::unique_ptr< QgsColorRamp > mRamp;
8786
QString mSubstring;

0 commit comments

Comments
 (0)
Please sign in to comment.