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:
dans la classe principale du plugin:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
ma classe qui hérite de QThread:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 def onProgress(self, i): self.progressDlg.show() self.progressDlg.setValue(i) def onEnd(self): self.bThreadEnCours = False
Quand je lance ça, il ne sort pas de la boucle while.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()
Donc le signal n'est pas lancé.
J'ai donc ajouté un "QtCore.QCoreApplication.processEvents()"
Là c'est nickel, j'ai ma barre de progression qui avance. Parfait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while self.bThreadEnCours: time.sleep(2) QtCore.QCoreApplication.processEvents()
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):
et là c'est la catastrophe!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()
Donc voilà...message qgis de plantage dumpé : minidump dans c:/...
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.
Partager