Bonjour à tous,
j'ai un script qui réalise des actions sur un ensemble de fichier PDF, d'une version ForEach... j'ai tenter la version parallélisation... qui marche...
Par contre pour finaliser mon appli, je souhaite ajouter à mon IHM une nouvelle progressbar en lien avec un multiprocessing.Pool de mon model.
Je me suis appuyer sur les deux lien ci-dessous, mais sans succès.
ici: https://codeloop.org/pyqt5-qprogress...tical-example/
et là : https://www.developpez.net/forums/d2...ead-threading/
Si vous avez une idée, par avance merci.
Ci dessous mon Model simplifié: QT_Model.py
et ma Vue simplifiée: QT_View.py
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 # -*- coding: utf-8 -*- # coding: utf8 import os, time,random import platform from multiprocessing import cpu_count import multiprocessing from PyQt5.QtCore import Qt, QThread, pyqtSignal class MyThread(QThread): # Create a counter thread change_value = pyqtSignal(int) cnt = 0 # def run(self): # # while MyThread.cnt < 100: # MyThread.cnt += 1 # time.sleep(0.3) # self.change_value.emit(MyThread.cnt) def f(self, name): print('hello', name) MyThread.cnt += 1 # simulation d'un traitement sur un fichier t = random.uniform(2.5, 10.0) time.sleep(t) print('\t ended', name) self.change_value.emit(MyThread.cnt) def f(name): print('hello', name) # simulation d'un traitement sur un fichier t = random.uniform(2.5, 10.0) time.sleep(t) print('\t ended', name) class test: def __init__(self): self.lstFile = os.listdir(r"c:\temp") print (self.lstFile) def fast(self): STARTTIME = time.time() tmp2=MyThread() with multiprocessing.Pool(processes=cpu_count())as pool: # version_Ok, sans Progressbar # pool.imap_unordered(f, self.lstFile) # version_Ko pool.imap_unordered(tmp2.f, self.lstFile) pool.close() pool.join() Message = "Traitement réalisé en {:.4f} secondes".format(time.time() - STARTTIME) print (Message) if __name__ == '__main__': tmp=test() tmp.fast()
Nota: afin d'essayer de respecter l'esprit MVC, je fait en sorte que la partie model soit exécutable en mode console ( je ne sais pas si c'est pertinent, si une personne expérimenté peux me donner son avis je cherche à progresser....)
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 # -*- coding: utf-8 -*- # coding: utf8 # source :https://codeloop.org/pyqt5-qprogressbar-with-qthread-practical-example/ import QT_Model from PyQt5.QtWidgets import QApplication, QDialog, QProgressBar, QPushButton, QVBoxLayout import sys from PyQt5.QtCore import Qt, QThread, pyqtSignal import time class MyThread(QThread): # Create a counter thread change_value = pyqtSignal(int) def run(self): cnt = 0 while cnt < 100: cnt+=1 time.sleep(0.3) self.change_value.emit(cnt) class Window(QDialog): def __init__(self, model): super().__init__() self.model = model maxNb=len(self.model.lstFile) print ("nb de fichiers a traiter",maxNb) vbox = QVBoxLayout() self.progressbar = QProgressBar() self.progressbar.setMaximum(maxNb) vbox.addWidget(self.progressbar) self.button = QPushButton("Start") self.button.clicked.connect(self.start) vbox.addWidget(self.button) self.setLayout(vbox) self.show() def start(self): print ("action ok") self.model.fast() self.thread = MyThread() self.thread.change_value.connect(self.setProgressVal) self.thread.start() def setProgressVal(self, val): print (val) self.progressbar.setValue(val) class Main: def __init__(self): self.App = QApplication(sys.argv) self.window = Window(QT_Model.test()) sys.exit(self.App.exec()) if __name__ == '__main__': Main()
Partager