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 : 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( )
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
# 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 : 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é")
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.