IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Arrêter un thread en python ?


Sujet :

Python

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Arrêter un thread en python ?
    Bonjour,

    J'ai commencé le Python depuis peu, mon pb est le suivant:
    je démarre un thread de scrutation du port serie à l'aide d'un GUI qui est déclaré de la maniére suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def Com_Watcher():
    c = 0 
    # scrutation du buffer d'entree 
    while 1: 
    while c == 0:
    c=com1.inWaiting()
     
    car = com1.read()
    com1.flushInput()
     
    if ord(car) == etat_cap_d1:
    action ...

  2. #2
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Arrêter un thread en python ?
    Bonjour,

    J'ai commencé le Python depuis peu, mon pb est le suivant:
    je démarre un thread de scrutation du port serie à l'aide d'un GUI qui est déclaré de la maniére suivante:

    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
     
    def Com_Watcher():
    c = 0 
    # scrutation du buffer d'entree 
    while 1: 
    while c == 0:
    c=com1.inWaiting()
     
    car = com1.read()
    com1.flushInput()
     
    if ord(car) == etat_cap_d1:
    action ...
     
     
    ComWatcher = threading.Thread(None,Com_Watcher,"comwatcher")
    ComWatcher.setDaemon(1)

    ensuite le thread est lancé lors de l'appui sur un bouton start par :
    ComWatcher.start()

    Mon problème est pour le stopper , ou le suspendre car je dois pouvoir le relancer ; car les threads ne peuvent pas être directement contrôlés de "l'extérieur" dixit O'reilly.

    Faut'il redéfinir une classe thread ?

    Si quelqu'un a une solution, je suis preneur.

    Merci de votre aide.

    SA

  3. #3
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Euh c'est ton While(1), il fait pas planter ta routine pas hasard?? Perso je pense que c'est a éviter... Si ton shell plante tu fais CTRL+c deja tu recupera la main.

    Essaie un truc du genre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(TRUE):
          try:scrutation + action 
          except: pass
    Est ce que ca reponds a ta demande???
    Sinon faudra demander a plus expert que moi ... dslé


    Tu devrais supprimer l'autre post qui est en double.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Attention parp1, exept prends un c -> except

    Sinon j'ai du mal à comprendre du python quand c'est pas indenter ...

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Désolé pour mes maladresses(message en double et pb d'indentation de code), je suis un néophite en matière de forum, merci qd même pour les comments.
    Pour répondre à Parp1, le thread fonctionne bien, c'est juste que je souhaite l'arrêter (voir le suspendre à l'aide d'un verrou) pour stopper la scrutation du port série.
    Mon problème est d'arriver à l'arrêter, j'essaie de mettre un booléen en global dans mon programme et de faire un
    while (FIN):
    mais ma variable n'a pas d'effet ?
    ComWatcher.setDaemon(1) est-il bloquant ?

    merci de votre aide.
    SA

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Février 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 76
    Points : 103
    Points
    103
    Par défaut
    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
     
    class ComWatcher(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.running = False
     
        def run(self):
            """Le code que le thread devra exécuter."""
            self.running = True
            # scrutation du buffer d'entree 
            while self.running:
                if com1.inWaiting():
                    # fontcion qui lit le port Com et analyse les données ou
                    # autre fonction qui avertit de la disponibilité de données...
                    appeler_la_fonction_adequate()
     
        def stop(self):
            self.running = False
     
    # 
    # Exemple d'utilisation
    #
     
    watcher = ComWatcher()
    # démarre le thread, l'arrête après 5 secondes
    watcher.start()
    time.sleep(5)
    watcher.stop()
    watcher.join()

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci Naxelas, c'est cool, ça fonctionne correctement.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Une petite réponse, bien plus tard...
    Bonjour bonjour,

    je réveille un file qui m'a bien aidé. Cependant, une petite précision : voilà comment je code mes thread- j'espère ne pas faire de grosses fautes, malgré :

    16.2.1. Thread Objects¶

    This class represents an activity that is run in a separate thread of control. There are two ways to specify the activity: by passing a callable object to the constructor, or by overriding the run() method in a subclass. No other methods (except for the constructor) should be overridden in a subclass. In other words, only override the __init__() and run() methods of this class.
    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
    class maThread(threading.Thread):
        def __init__(self, *args, **kwargs):
            """Initialisation de la thread, partie qui ne se joue qu'une seule fois."""
            threading.Thread.__init__(self)
            self.running = True
            # Ici, on peut récupérer les variables et même initialiser le port série
            # par exemple.
     
        def run(self):
            """Partie de programme qui se répète."""
            while self.running:
                # Ici le contenu de la thread, ou la fonction que la thread appelle.
     
        def stop(self):
            """Permet un arrêt propre de la thread."""
            self.running = False
     
    def main():
        thread1 = maThread()
        thread1.start()
        # la suite du programme, jusqu'à devoir arreter la thread à  l'aide de :
        thread1.stop()
        thread1.join(1) # 1s de timeout
        # la suite du main()
     
    if __name__ == '__main__':
        """Lancement du fichier seul."""
        status = main()
        sys.exit(status)
    Une petite remarque : thread1.join() retourne none, que la thread se soit arrêtée, ou que le timeout ait expiré. Il faut donc ensuite faire thread1.is_alive() pour savoir si la thread est encore en route, ou non.

    En espérant que cela puisse aider...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/10/2006, 18h56
  2. Effectuer du multi THREAD en python
    Par parp1 dans le forum Général Python
    Réponses: 3
    Dernier message: 10/05/2006, 13h56
  3. [Thread] arrêter un thread
    Par melvar dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 10/04/2006, 19h06
  4. Réponses: 18
    Dernier message: 06/04/2005, 15h09
  5. Arrêter une Thread brutalement!
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 22h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo