Skip to content

Commit 593e3d0

Browse files
committedDec 20, 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. (cherry picked from commit 1f10b81)
1 parent d30a7be commit 593e3d0

File tree

2 files changed

+21
-19
lines changed

2 files changed

+21
-19
lines changed
 

‎src/gui/raster/qgspalettedrendererwidget.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -842,28 +842,31 @@ void QgsPalettedRendererClassGatherer::run()
842842
mFeedback = new QgsRasterBlockFeedback();
843843
connect( mFeedback, &QgsRasterBlockFeedback::progressChanged, this, &QgsPalettedRendererClassGatherer::progressChanged );
844844

845-
QgsPalettedRasterRenderer::ClassData newClasses = QgsPalettedRasterRenderer::classDataFromRaster( mLayer->dataProvider(), mBandNumber, mRamp.get(), mFeedback );
846-
847-
// combine existing classes with new classes
848-
QgsPalettedRasterRenderer::ClassData::iterator classIt = newClasses.begin();
849-
emit progressChanged( 0 );
850-
qlonglong i = 0;
851-
for ( ; classIt != newClasses.end(); ++classIt )
845+
if ( mProvider )
852846
{
853-
// check if existing classes contains this same class
854-
for ( const QgsPalettedRasterRenderer::Class &existingClass : std::as_const( mClasses ) )
847+
QgsPalettedRasterRenderer::ClassData newClasses = QgsPalettedRasterRenderer::classDataFromRaster( mProvider.get(), mBandNumber, mRamp.get(), mFeedback );
848+
849+
// combine existing classes with new classes
850+
QgsPalettedRasterRenderer::ClassData::iterator classIt = newClasses.begin();
851+
emit progressChanged( 0 );
852+
qlonglong i = 0;
853+
for ( ; classIt != newClasses.end(); ++classIt )
855854
{
856-
if ( existingClass.value == classIt->value )
855+
// check if existing classes contains this same class
856+
for ( const QgsPalettedRasterRenderer::Class &existingClass : std::as_const( mClasses ) )
857857
{
858-
classIt->color = existingClass.color;
859-
classIt->label = existingClass.label;
860-
break;
858+
if ( existingClass.value == classIt->value )
859+
{
860+
classIt->color = existingClass.color;
861+
classIt->label = existingClass.label;
862+
break;
863+
}
861864
}
865+
i ++;
866+
emit progressChanged( 100 * ( i / static_cast<float>( newClasses.count() ) ) );
862867
}
863-
i ++;
864-
emit progressChanged( 100 * ( i / static_cast<float>( newClasses.count() ) ) );
868+
mClasses = newClasses;
865869
}
866-
mClasses = newClasses;
867870

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

‎src/gui/raster/qgspalettedrendererwidget.h

Lines changed: 2 additions & 3 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

@@ -46,7 +45,7 @@ class QgsPalettedRendererClassGatherer: public QThread
4645

4746
public:
4847
QgsPalettedRendererClassGatherer( QgsRasterLayer *layer, int bandNumber, const QgsPalettedRasterRenderer::ClassData &existingClasses, QgsColorRamp *ramp = nullptr )
49-
: mLayer( layer )
48+
: mProvider( ( layer && layer->dataProvider() ) ? layer->dataProvider()->clone() : nullptr )
5049
, mBandNumber( bandNumber )
5150
, mRamp( ramp )
5251
, mClasses( existingClasses )
@@ -87,7 +86,7 @@ class QgsPalettedRendererClassGatherer: public QThread
8786

8887
private:
8988

90-
QgsRasterLayer *mLayer = nullptr;
89+
std::unique_ptr< QgsRasterDataProvider > mProvider;
9190
int mBandNumber;
9291
std::unique_ptr< QgsColorRamp > mRamp;
9392
QString mSubstring;

0 commit comments

Comments
 (0)
Please sign in to comment.