Nuestro proyecto QGIS se genera dinámicamente en el inicio basado en los roles de usuario. Hay cerca de 120 QgsVectorLayers que necesitan ser generados. Si se crean secuencialmente, el proceso de inicio de sesión tarda hasta 2 minutos, lo que es realmente molesto.
Así que pensé en usar un QThreadPool y crear las capas allí. Así que los hilos básicamente sólo llaman a este tipo de código:
class LayerLoaderWorker(QRunnable):
def run(self):
db_connect = DatabaseConnection()
uri = QgsDataSourceUri()
uri.setConnection(db_connect.host, str(db_connect.port), db_connect.dbname, db_connect.user,
db_connect.password)
uri.setDataSource('public', self.viewname, 'geometry', '', 'id')
locker = QMutexLocker(mutex)
self.layer = QgsVectorLayer(uri.uri(False), self.layerSettings.displayname, "postgres")
self.finished = True
self.loader.workerFinished()
locker.unlock()
Sólo las capas se crean en los hilos, después de la creación se añaden a la QgsProject
en el hilo principal (UI). A veces parece funcionar, pero la mayoría de las veces las capas no se cargan correctamente y la columna de geometría está vacía.
¿Es la creación del QgsVectorLayer
objeto thread safe? Me parece que este no es el caso. Leí en alguna parte que las cosas relacionadas con la interfaz de usuario deben ser manejados en el UI-Thread, pero pensé que la creación del objeto (que parece conectarse a la base de datos que lleva algún tiempo) es una tarea no-ui.
¿Es posible cargar capas en paralelo de alguna manera?