QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
qgsmaprendererjobproxy.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmaprendererjobproxy.cpp
3  --------------------------
4  begin : January 2017
5  copyright : (C) 2017 by Paul Blottiere
6  email : paul dot blottiere at oslandia dot com
7 ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgsmaprendererjobproxy.h"
19 
20 #include "qgsmessagelog.h"
23 #include "qgsapplication.h"
24 
25 namespace QgsWms
26 {
27 
29  bool parallelRendering
30  , int maxThreads
31  , QgsFeatureFilterProvider *featureFilterProvider
32  )
33  :
34  mParallelRendering( parallelRendering )
35  , mFeatureFilterProvider( featureFilterProvider )
36  {
37 #ifndef HAVE_SERVER_PYTHON_PLUGINS
38  Q_UNUSED( mFeatureFilterProvider )
39 #endif
40  if ( mParallelRendering )
41  {
42  QgsApplication::setMaxThreads( maxThreads );
43  QgsMessageLog::logMessage( QStringLiteral( "Parallel rendering activated with %1 threads" ).arg( maxThreads ), QStringLiteral( "server" ), Qgis::MessageLevel::Info );
44  }
45  else
46  {
47  QgsMessageLog::logMessage( QStringLiteral( "Parallel rendering deactivated" ), QStringLiteral( "server" ), Qgis::MessageLevel::Info );
48  }
49  }
50 
51  void QgsMapRendererJobProxy::render( const QgsMapSettings &mapSettings, QImage *image )
52  {
53  if ( mParallelRendering )
54  {
55  QgsMapRendererParallelJob renderJob( mapSettings );
56 #ifdef HAVE_SERVER_PYTHON_PLUGINS
57  renderJob.setFeatureFilterProvider( mFeatureFilterProvider );
58 #endif
59 
60  // Allows the main thread to manage blocking call coming from rendering
61  // threads (see discussion in https://github.com/qgis/QGIS/issues/26819).
62  QEventLoop loop;
63  QObject::connect( &renderJob, &QgsMapRendererParallelJob::finished, &loop, &QEventLoop::quit );
64  renderJob.start();
65  if ( renderJob.isActive() )
66  {
67  loop.exec();
68 
69  renderJob.waitForFinished();
70  *image = renderJob.renderedImage();
71  mPainter.reset( new QPainter( image ) );
72  }
73 
74  mErrors = renderJob.errors();
75  }
76  else
77  {
78  mPainter.reset( new QPainter( image ) );
79  QgsMapRendererCustomPainterJob renderJob( mapSettings, mPainter.get() );
80 #ifdef HAVE_SERVER_PYTHON_PLUGINS
81  renderJob.setFeatureFilterProvider( mFeatureFilterProvider );
82 #endif
83  renderJob.renderSynchronously();
84  mErrors = renderJob.errors();
85  }
86  }
87 
88  QPainter *QgsMapRendererJobProxy::takePainter()
89  {
90  return mPainter.release();
91  }
92 } // namespace qgsws
QgsApplication::setMaxThreads
static void setMaxThreads(int maxThreads)
Set maximum concurrent thread count.
Definition: qgsapplication.cpp:2279
qgsmaprenderercustompainterjob.h
qgsmaprendererjobproxy.h
qgsapplication.h
QgsMapRendererParallelJob
Job implementation that renders all layers in parallel.
Definition: qgsmaprendererparalleljob.h:32
QgsWms::QgsMapRendererJobProxy::QgsMapRendererJobProxy
QgsMapRendererJobProxy(bool parallelRendering, int maxThreads, QgsFeatureFilterProvider *featureFilterProvider)
Constructor for QgsMapRendererJobProxy.
Definition: qgsmaprendererjobproxy.cpp:41
QgsMessageLog::logMessage
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Definition: qgsmessagelog.cpp:27
QgsMapRendererCustomPainterJob
Job implementation that renders everything sequentially using a custom painter.
Definition: qgsmaprenderercustompainterjob.h:63
QgsWms
Median cut implementation.
Definition: qgsdxfwriter.cpp:22
QgsFeatureFilterProvider
Abstract interface for use by classes that filter the features or attributes of a layer.
Definition: qgsfeaturefilterprovider.h:43
qgsmaprendererparalleljob.h
QgsMapSettings
The QgsMapSettings class contains configuration for rendering of the map. The rendering itself is don...
Definition: qgsmapsettings.h:88
qgsmessagelog.h
QgsMapRendererJob::finished
void finished()
emitted when asynchronous rendering is finished (or canceled).