¿Cómo implemento PyQGIS multihilo para actualizar una barra de progreso?

9

Estoy desarrollando un complemento PyQGIS usando python. Me enfrento a un problema durante la implementación de subprocesos en mi complemento. He escrito un script de Python que contiene una clase que envuelve todos los métodos de geoprocesamiento en uso. El problema que estoy enfrentando es procesar los métodos en hilos. Para dar una mejor idea de mi problema, tengo una interfaz de usuario que llama al método calcNDVI()como:

self.lst.calcNDVI(self.RedBand, self.NIRBand, None, self.outputRaster, self.sensorType, self.dataType, self.addToQGIS)

Esta llamada a función, llama a un método calcNDVI () que hace toda la magia y agrega el resultado a un proyecto QGIS. La llamada al método también está asociada con pasar algunos argumentos.

He pasado por muchas fuentes, pero no puedo entender cómo puedo implementar mis algoritmos de manera roscada. El código que obtuve implementa todo en el método de ejecución, lo que me dificulta, ya que tengo más de un método para procesar en mi clase, y también me gustaría que el usuario pueda elegir qué método ejecutar la interfaz de usuario

Estoy procesando conjuntos de datos Landsat que requieren demasiado tiempo para procesar.

Milton Isaya
fuente

Respuestas:

1

Primero, implemente todos sus cálculos pesados ​​en una subclase QRunnable. Eche un vistazo aquí para obtener más detalles ( http://pyqt.sourceforge.net/Docs/PyQt4/qrunnable.html ). Después de eso, en el botón Aceptar (o en el método que iniciará el proceso) puede hacer algo como esto:

    # Initiating processing
    task = ThreadTask(init parameters...)
    task.setParameters( your parameters here...)
    # Connect your signal here (somethig like this)
    task.signals.processFinished.connect(self.processFinished)
    task.signals.errorOccurred.connect(self.errorOccurred)
    task.signals.userCanceled.connect(self.userCanceled)
    # Setting the progress bar
    self.progressMessageBar = self.iface.messageBar().createMessage('Processing landsat image...')
    self.progressBar = QtGui.QProgressBar()
    self.progressBar.setAlignment(Qt.AlignLeft|Qt.AlignVCenter)
    self.progressMessageBar.layout().addWidget(self.progressBar)
    self.iface.messageBar().pushWidget(self.progressMessageBar, self.iface.messageBar().INFO)
    self.progressBar.setRange(0, 0)
    self.progressMessageBar.destroyed.connect(task.signals.cancel)
    # Starting process
    self.threadpool.start(task)

Recuerde crear un objeto QThreadPool para iniciar su hilo:

self.threadpool = QThreadPool()
lcoandrade
fuente