[QThread] Lancer plusieurs threads en parallele
Bonjour,
je débute avec la notion de thread et je ne parviens pas à obtenir le comportement que je veux dans mon appli PyQt.
J'ai une liste de simulations numériques à lancer, et je voudrais les lancer simultanément.
Une "simulation" est représentée dans mon programme par un nom de fichier. Je démarre la simulation en utilisant os.system() afin d'exécuter ce fichier.
Lorsque plusieurs fichiers sont exécutés en même temps, le simulateur se charge tout seul de répartir les simulations sur les différents CPU de la machine.
Voici mon code (version simplifiée):
Code:
1 2 3 4 5 6 7 8
| def lancerSimusParallele(self, listeSimus):
'''
SLOT d un bouton "Demarrer" de l IHM
- listeSimus: [list de str] liste des fichiers a executer
'''
for i in range(listeSimus):
thread = ThreadSimu(listeSimus[i], i)
thread.start() |
Avec ci-dessous le code de ma classe "ThreadSimu":
Code:
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
| class ThreadSimu(QtCore.QThread):
'''
QThread pour le lancement d une simulation
'''
def __init__(self, simu, numSimu):
'''
Constructeur de la classe ThreadSimu
- simu: [str] fichier correspondant a la simulation a lancer
- numSimu: [int] numero de la simulation
'''
QtCore.QThread.__init__(self)
self.simu = simu
self.numSimu = numSimu
def start(self):
'''
Demarrage de la simulation
'''
print "DEMARRAGE DE LA SIMULATION%d"%self.numSimu
# precalculs avant l execution du fichier
[...]
# Execution du fichier
status = os.system("sh %s &" % self.simu)
self.run()
def run(self):
'''
Suivi du deroulement de la simulation
'''
time.sleep(3) # En realite, lecture de fichiers et affichage de l'avancement sur l'IHM grace a des signaux
print "SIMULATION %d TERMINEE"%self.numSimu |
(Précision je suis sous Linux).
Voici le comportement que je souhaite avoir:
Code:
1 2 3 4 5 6 7
| DEMARRAGE DE LA SIMULATION 1
DEMARRAGE DE LA SIMULATION 2
DEMARRAGE DE LA SIMULATION 3
[...] 3 secondes s ecoulent...
SIMULATION 1 TERMINEE
SIMULATION 2 TERMINEE
SIMULATION 3 TERMINEE |
Voici le comportement que j'ai avec le code ci-dessus:
Code:
1 2 3 4 5 6 7 8 9
| DEMARRAGE DE LA SIMULATION 1
[...] 3 secondes s ecoulent...
SIMULATION 1 TERMINEE
DEMARRAGE DE LA SIMULATION 2
[...] 3 secondes s ecoulent...
SIMULATION 2 TERMINEE
DEMARRAGE DE LA SIMULATION 3
[...] 3 secondes s ecoulent...
SIMULATION 3 TERMINEE |
Le lancement des Threads en parallele ne fonctionne donc pas du tout, mais je ne comprends pas ce qui ne va pas dans mon code?
Merci d'avance pour votre aide!