Skip to content

Commit 31c788d

Browse files
committedFeb 25, 2016
Fix rendering crash in debug mode (fixes #14369)
Introduced in b6de197 due to the use of static variables in a function that is called from multiple threads. Further changes to logging: - also works when sequential rendering is used - also works in release mode (to allow checking of rendering speed in normal QGIS release)
1 parent a934b01 commit 31c788d

File tree

4 files changed

+39
-40
lines changed

4 files changed

+39
-40
lines changed
 

‎src/core/qgsmaprenderercustompainterjob.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ void QgsMapRendererCustomPainterJob::futureFinished()
200200
mRenderingTime = mRenderingStart.elapsed();
201201
QgsDebugMsg( "QPAINTER futureFinished" );
202202

203+
logRenderingTime( mLayerJobs );
204+
203205
// final cleanup
204206
cleanupJobs( mLayerJobs );
205207

@@ -248,8 +250,15 @@ void QgsMapRendererCustomPainterJob::doRender()
248250
}
249251

250252
if ( !job.cached )
253+
{
254+
QTime layerTime;
255+
layerTime.start();
256+
251257
job.renderer->render();
252258

259+
job.renderingTime = layerTime.elapsed();
260+
}
261+
253262
if ( job.img )
254263
{
255264
// If we flattened this layer for alternate blend modes, composite it now

‎src/core/qgsmaprendererjob.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "qgsmaplayerrenderer.h"
3030
#include "qgsmaplayerstylemanager.h"
3131
#include "qgsmaprenderercache.h"
32+
#include "qgsmessagelog.h"
3233
#include "qgspallabeling.h"
3334
#include "qgsvectorlayerrenderer.h"
3435
#include "qgsvectorlayer.h"
@@ -245,6 +246,7 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabelin
245246
job.img = nullptr;
246247
job.blendMode = ml->blendMode();
247248
job.layerId = ml->id();
249+
job.renderingTime = -1;
248250

249251
job.context = QgsRenderContext::fromMapSettings( mSettings );
250252
job.context.setPainter( painter );
@@ -367,3 +369,22 @@ QImage QgsMapRendererJob::composeImage( const QgsMapSettings& settings, const La
367369
painter.end();
368370
return image;
369371
}
372+
373+
void QgsMapRendererJob::logRenderingTime( const LayerRenderJobs& jobs )
374+
{
375+
QSettings settings;
376+
if ( !settings.value( "/Map/logCanvasRefreshEvent", false ).toBool() )
377+
return;
378+
379+
QMultiMap<int, QString> elapsed;
380+
Q_FOREACH ( const LayerRenderJob& job, jobs )
381+
elapsed.insert( job.renderingTime, job.layerId );
382+
383+
QList<int> tt( elapsed.uniqueKeys() );
384+
qSort( tt.begin(), tt.end(), qGreater<int>() );
385+
Q_FOREACH ( int t, tt )
386+
{
387+
QgsMessageLog::logMessage( tr( "%1 ms: %2" ).arg( t ).arg( QStringList( elapsed.values( t ) ).join( ", " ) ), tr( "Rendering" ) );
388+
}
389+
QgsMessageLog::logMessage( "---", tr( "Rendering" ) );
390+
}

‎src/core/qgsmaprendererjob.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct LayerRenderJob
4747
QPainter::CompositionMode blendMode;
4848
bool cached; // if true, img already contains cached image from previous rendering
4949
QString layerId;
50+
int renderingTime; //!< time it took to render the layer in ms (it is -1 if not rendered or still rendering)
5051
};
5152

5253
typedef QList<LayerRenderJob> LayerRenderJobs;
@@ -155,6 +156,9 @@ class CORE_EXPORT QgsMapRendererJob : public QObject
155156
//! @note not available in python bindings
156157
void cleanupJobs( LayerRenderJobs& jobs );
157158

159+
//! @note not available in python bindings
160+
void logRenderingTime( const LayerRenderJobs& jobs );
161+
158162
static QImage composeImage( const QgsMapSettings& settings, const LayerRenderJobs& jobs );
159163

160164
bool needTemporaryImage( QgsMapLayer* ml );

‎src/core/qgsmaprendererparalleljob.cpp

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@
1919
#include "qgslogger.h"
2020
#include "qgsmaplayerrenderer.h"
2121
#include "qgspallabeling.h"
22-
#include "qgsmessagelog.h"
2322

2423
#include <QtConcurrentMap>
25-
#include <QSettings>
2624

2725
#define LABELING_V2
2826

@@ -188,6 +186,8 @@ void QgsMapRendererParallelJob::renderLayersFinished()
188186
// compose final image
189187
mFinalImage = composeImage( mSettings, mLayerJobs );
190188

189+
logRenderingTime( mLayerJobs );
190+
191191
cleanupJobs( mLayerJobs );
192192

193193
QgsDebugMsg( "PARALLEL layers finished" );
@@ -227,22 +227,9 @@ void QgsMapRendererParallelJob::renderLayerStatic( LayerRenderJob& job )
227227
if ( job.cached )
228228
return;
229229

230-
#ifdef QGISDEBUG
231-
static QSet<QString> running;
232-
static QMultiMap<int, QString> elapsed;
233-
234-
QSettings settings;
235-
bool log = settings.value( "/Map/logCanvasRefreshEvent", false ).toBool();
236-
237230
QTime t;
238231
t.start();
239-
QgsDebugMsg( QString( "job %1 start" ).arg( reinterpret_cast< ulong >( &job ), 0, 16 ) );
240-
if ( log )
241-
{
242-
QgsMessageLog::logMessage( tr( "Layer %1 job started" ).arg( job.layerId ), tr( "Rendering" ) );
243-
running << job.layerId;
244-
}
245-
#endif
232+
QgsDebugMsg( QString( "job %1 start (layer %2)" ).arg( reinterpret_cast< ulong >( &job ), 0, 16 ).arg( job.layerId ) );
246233

247234
try
248235
{
@@ -261,30 +248,8 @@ void QgsMapRendererParallelJob::renderLayerStatic( LayerRenderJob& job )
261248
QgsDebugMsg( "Caught unhandled unknown exception" );
262249
}
263250

264-
#ifdef QGISDEBUG
265-
int tt = t.elapsed();
266-
267-
QgsDebugMsg( QString( "job %1 end [%2 ms]" ).arg( reinterpret_cast< ulong >( &job ), 0, 16 ).arg( tt ) );
268-
269-
if ( log )
270-
{
271-
running.remove( job.layerId );
272-
elapsed.insert( tt, job.layerId );
273-
274-
QgsMessageLog::logMessage( tr( "Layer %1 job ended (%2 ms; still running:%3)" ).arg( job.layerId ).arg( tt ).arg( QStringList( running.values() ).join( ", " ) ), tr( "Rendering" ) );
275-
if ( running.isEmpty() )
276-
{
277-
QList<int> tt( elapsed.keys() );
278-
qSort( tt.begin(), tt.end(), qGreater<int>() );
279-
Q_FOREACH ( int t, tt )
280-
{
281-
QgsMessageLog::logMessage( tr( "%1 ms: %2" ).arg( t ).arg( QStringList( elapsed.values( t ) ).join( ", " ) ), tr( "Rendering" ) );
282-
}
283-
QgsMessageLog::logMessage( "---", tr( "Rendering" ) );
284-
elapsed.clear();
285-
}
286-
}
287-
#endif
251+
job.renderingTime = t.elapsed();
252+
QgsDebugMsg( QString( "job %1 end [%2 ms] (layer %3)" ).arg( reinterpret_cast< ulong >( &job ), 0, 16 ).arg( job.renderingTime ).arg( job.layerId ) );
288253
}
289254

290255

0 commit comments

Comments
 (0)
Failed to load comments.