Bagaimana cara menerapkan multithreading PyQGIS untuk memperbarui bilah kemajuan

9

Saya sedang mengembangkan plugin PyQGIS menggunakan python. Saya menghadapi masalah selama implementasi threading di plugin saya. Saya telah menulis skrip Python yang berisi kelas yang membungkus semua metode geo-processing yang digunakan. Masalah yang saya hadapi adalah memproses metode dalam utas. Untuk memberikan gambaran yang lebih baik tentang masalah saya, saya memiliki UI yang menyebut metode ini calcNDVI()sebagai:

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

Panggilan fungsi ini, memanggil metode calcNDVI () yang melakukan semua keajaiban dan menambahkan hasilnya ke proyek QGIS. Pemanggilan metode juga dikaitkan dengan melewati beberapa argumen.

Saya telah melalui banyak sumber tetapi saya tidak dapat memahami bagaimana saya dapat mengimplementasikan algoritma saya dengan cara berulir. Kode yang saya datangi mengimplementasikan semua yang ada di metode run yang menyulitkan saya karena saya memiliki lebih dari satu metode untuk diproses di kelas saya, dan saya juga ingin pengguna dapat memilih metode mana yang akan dijalankan UI.

Saya sedang memproses dataset Landsat yang membutuhkan waktu terlalu lama untuk diproses.

Milton Isaya
sumber

Jawaban:

1

Pertama, terapkan semua perhitungan berat Anda dalam subkelas QRunnable. Lihatlah di sini untuk mendapatkan detail lebih lanjut ( http://pyqt.sourceforge.net/Docs/PyQt4/qrunnable.html ). Setelah itu di tombol ok Anda (atau dalam metode yang akan memulai proses) Anda dapat melakukan sesuatu seperti ini:

    # 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)

Ingatlah untuk membuat objek QThreadPool untuk memulai utas Anda:

self.threadpool = QThreadPool()
pendamping
sumber