[pyQt4] QThread et minidump ou signaux perdus
Bonjour,
Je développe une extension dans QGIS.
Elle est opérationnelle, il ne me reste plus qu'à lancer une barre de progression pour les traitements longs.
J'ai donc d'abord fait un test de la barre de progression "à vide" avec ce code:
Dans le run de du plugin:
Code:
1 2 3 4 5 6 7 8 9
| self.progressDlg = QtGui.QProgressDialog()
self.progressDlg.setRange(0,100)
self.threadJointure = ThreadJointure(bdd, zonesT)
self.threadJointure.notifyProgress.connect(self.onProgress)
self.threadJointure.endThread.connect(self.onEnd)
self.bThreadEnCours = True
self.threadJointure.start()
while self.bThreadEnCours:
time.sleep(2) |
dans la classe principale du plugin:
Code:
1 2 3 4 5 6
|
def onProgress(self, i):
self.progressDlg.show()
self.progressDlg.setValue(i)
def onEnd(self):
self.bThreadEnCours = False |
ma classe qui hérite de QThread:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class ThreadJointure(QtCore.QThread):
def __init__(self, bdd, zonesT, parent=None):
QThread.__init__(self, parent)
self.bdd = bdd
self.zonesT = zonesT
def run(self):
self.notifyProgress.emit(0)
time.sleep(3)
self.notifyProgress.emit(33)
time.sleep(3)
self.notifyProgress.emit(66)
time.sleep(3)
self.notifyProgress.emit(100)
self.endThread.emit()
notifyProgress = QtCore.pyqtSignal(int)
endThread = QtCore.pyqtSignal() |
Quand je lance ça, il ne sort pas de la boucle while.
Donc le signal n'est pas lancé.
J'ai donc ajouté un "QtCore.QCoreApplication.processEvents()"
Code:
1 2 3
| while self.bThreadEnCours:
time.sleep(2)
QtCore.QCoreApplication.processEvents() |
Là c'est nickel, j'ai ma barre de progression qui avance. Parfait.
Sauf que ça n'a aucun intérêt d'afficher une barre de progression sans traitement derrière.
Donc je prends le risque et je remplace la partie du run dans le Thread pour faire appel au traitement (seulement un petit morceau pour commencer):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class ThreadJointure(QtCore.QThread):
def __init__(self, bdd, zonesT, parent=None):
QThread.__init__(self, parent)
self.bdd = bdd
self.zonesT = zonesT
def run(self):
self.notifyProgress.emit(0)
# affectation des vecteurs à traiter
self.bdd.remplirTableZon(self.zonesT)
self.notifyProgress(100)
self.endThread.emit()
notifyProgress = QtCore.pyqtSignal(int)
endThread = QtCore.pyqtSignal() |
et là c'est la catastrophe!:calim2:
Citation:
message qgis de plantage dumpé : minidump dans c:/...
Donc voilà...
A savoir dans mon remplirTableZon, je récupère le contenu d'une couche vecteur pour tout mettre dans une base spatialite.
J'ai essayé de passer par un une classe dérivant de QObjet que je migre vers un QThread. Là pas de plantage, mais rien n'est fait: il fait comme si la base de donnée n'existait pas! Par contre il envoie bien le signal de fin de traitement...
Si j'enlève le processEvents il boucle à l'infini conne si personne n'envoyait de message...
Merci pour votre aide.