Làm cách nào để triển khai đa luồng PyQGIS để cập nhật thanh tiến trình


9

Tôi đang phát triển plugin PyQGIS bằng python. Tôi gặp phải một vấn đề trong quá trình thực hiện luồng trong plugin của mình. Tôi đã viết một tập lệnh Python chứa một lớp bao gồm tất cả các phương thức xử lý địa lý đang sử dụng. Vấn đề tôi gặp phải là xử lý các phương thức trong các luồng. Để đưa ra một bức tranh tốt hơn về vấn đề của tôi, tôi có một giao diện người dùng gọi phương thức này calcNDVI()là:

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

Hàm này gọi, gọi một phương thức calcNDVI () thực hiện tất cả các phép thuật và thêm kết quả vào một dự án QGIS. Cuộc gọi phương thức cũng được liên kết với việc truyền một số đối số.

Tôi đã trải qua nhiều nguồn nhưng tôi không thể hiểu làm thế nào tôi có thể thực hiện các thuật toán của mình theo cách có luồng. Mã tôi đã thực hiện thông qua tất cả mọi thứ trong phương thức chạy, điều này gây khó khăn cho tôi vì tôi có nhiều hơn một phương thức được xử lý trong lớp và tôi cũng muốn người dùng có thể chọn phương thức nào được chạy qua giao diện người dùng.

Tôi đang xử lý bộ dữ liệu Landsat mất quá nhiều thời gian để xử lý.

Câu trả lời:


1

Đầu tiên, thực hiện tất cả các tính toán nặng nề của bạn trong một lớp con QRunnable. Hãy xem tại đây để biết thêm chi tiết ( http://pyqt.sourceforge.net/Docs/PyQt4/qrunnable.html ). Sau đó trong nút ok của bạn (hoặc trong phương thức sẽ bắt đầu quá trình), bạn có thể làm một cái gì đó như thế này:

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

Hãy nhớ tạo một đối tượng QThreadPool để bắt đầu chuỗi của bạn:

self.threadpool = QThreadPool()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.