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 :
Et mes events pour lancer/fermer les threads:
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 # 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( )
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 # 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()))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.
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 # 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é")
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.
Partager