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
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()
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
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()
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....)