Problème arrêt de threads
Bonjour,
Je tente d'écrire un programme contenant deux threads, un pour lire les données sur une liaison RS232, l'autre pour l'écriture dans un fichier. Le tout est avec une interface wxpython, et des events pour démarrer/couper les threads.
J'ai essayé d'utiliser un des exemple de la FAQ, mais si les threads se lancent bien, ils ne s'arrêtent pas.
Les deux threads :
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| # Thread de lecture du port COM; tourne en boucle tant que le COM est ouvert
class lecture(threading.Thread):
def __init__(self,nom=''):
threading.Thread.__init__(self)
self.nom = nom
self._stopevent = threading.Event( )
def run(self):
global donnees
self.Running = True
print("Thread 1 lancé")
while not self._stopevent.isSet():
try:
if ser.inWaiting() != 0:
chaine = ser.read(ser.inWaiting())
chaine = chaine.replace("\x00","")
donnees = " Tension = {0}".format(chaine)
self._stopevent.wait(1.0)
except:
pass
sleep(1)
print("Thread 1 arrêté")
def stop(self):
self._stopevent.set( )
# Thread d'enregistrement des données
class log_data(threading.Thread):
def __init__(self, nom=''):
threading.Thread.__init__(self)
self.nom = nom
self._stopevent = threading.Event( )
os.chdir("D:/data")
def run(self):
i = 0
print("Le thread 2 est lancé")
while not self._stopevent.isSet():
file = open("test2.txt", "a")
i+=1
file.write("Mesure n°"+str(i)+"\n")
print(i)
file.close()
self._stopevent.wait(1.0)
sleep(1)
print "Le thread 2 s'est terminé"
def stop(self):
self._stopevent.set( ) |
Et mes events pour lancer/fermer les threads:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| # Event ouverture/fermeture du port COM
def OnButtonClick_COM(self,event):
thread_read = lecture('Thread A')
if ser.isOpen()==False:
try:
ser.open()
self.labelCOM.SetLabel(" COM opened : " + str(ser.isOpen()))
thread_read.start()
self.timer.Start(500)
except:
dlg = wx.MessageDialog(self,
message="Vérifer la connexion RS232.",
caption="Erreur",
style=wx.OK
)
dlg.ShowModal()
dlg.Destroy()
else:
thread_read.stop()
self.timer.Stop()
ser.close()
self.labelCOM.SetLabel(" COM opened : " + str(ser.isOpen())) |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| # Event enregistrement
def StartReg(self,event):
if ser.isOpen() == True:
thread_log = log_data('Thread B')
thread_log.start()
self.labelReg.SetLabel(" Enregistrement en cours")
else:
dlg = wx.MessageDialog(self,
message="Le port COM n'est pas ouvert.",
caption="Erreur",
style=wx.OK
)
dlg.ShowModal()
dlg.Destroy()
def StopReg(self,event):
thread_log = log_data('Thread B')
thread_log.stop()
self.labelReg.SetLabel(" Enregistrement stoppé") |
J'ai essayé sur fichier de test ne contenant qu'un thread, que je lance en console, et ça se lance et s'arrête très bien.
Je précise que je suis loin d'être un spécialiste en python, et même en programmation en général.
Si vous voyez où j'ai fait une erreur, je vous en remercie d'avance.