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 :

Interruption thread


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Automatisme
    Inscrit en
    Juillet 2015
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Automatisme
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2015
    Messages : 201
    Par défaut Interruption thread
    Bonjour,

    J'ai crée une class tempo mais lorsque je veux générer une interruption dans le main, le programme Main s'arrête un certain temps sur la méthode Join()
    J'ai l'impression que le thread continu son itération sur la boucle FOR alors que je force la variable "i" à la valeur de la fin de la boucle
    Qui a une idée ?

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    import threading
    import time
    
    stop_threads = False
    
    class Tempo (threading.Thread):
        # Parametres: preset => duree , 
                    # base => base de temps (0.1s ou 1s), 
                    # mode => TON ou TOF
        def __init__(self, preset, base, mode):
            threading.Thread.__init__(self)
            self.preset = preset
            self.base = base
            self.mode = mode
    
        def run(self):
            #if self.base == 1:
            #   self.preset = self.preset * 10
            if (self.mode == "TOF"):
                self.etat = True
            if (self.mode == "TON"):
                self.etat = False
                
            if stop_threads: 
                i = self.preset        
            for i in range(0, self.preset):
                time.sleep(self.base)
       
            if (self.mode == "TOF"):
                self.etat = False
            if (self.mode == "TON"):
                self.etat = True
    
    T1 = Tempo(10,0.1,"TON")   # (10 x base=0.1s) = 1s retard enclenchement
    T1.start()
    
    T2 = Tempo(6,0.5,"TOF")   # (3 x base=0,5s) = 3s retard au declenchement
    T2.start()                
    
    for i in range(0, 20):
        print("programme ", i)
        if T1.etat:
            print ("T1 done")
            T1.etat = False 
            # activation sortie 
        if T2.etat:
            print ("T2 actif")
            # activation sortie 
        else:
            print ("T2 done")  
            # desactivation sortie 
        if T1.is_alive():
            print("T1 is actif")   
        if (i == 9 and T1.is_alive()):
           print ("Kill T1 demande") 
           stop_threads = True    
           T1.join()  
           stop_threads = False 
           print('thread T1 killed') 
        if (i == 7 ):  
           print ("relance T1") 
           T1 = Tempo(10,1,"TON")   # (10 x base=1s) = 10s retard enclenchement
           T1.start()
        time.sleep(1)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if stop_threads: 
                i = self.preset        
            for i in range(0, self.preset):
                time.sleep(self.base)
    On entre dans la boucle après la mise à jour de i et comme on ne teste pas la condition "dans" la boucle, une fois que c'est parti... çà attend la fin.

    Ensuite... quoique que vous mettiez dans la variable i , si vous l'utilisez comme index de boucle, vous n'en tenez pas compte...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Femme Profil pro
    Automatisme
    Inscrit en
    Juillet 2015
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Automatisme
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2015
    Messages : 201
    Par défaut
    Désolée j'ai pas envoyé la bonne partie du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            for i in range(0, self.preset):
                time.sleep(0.1)
                if stop_threads: 
                    i = self.preset
    Le stop_thread est bien dans la boucle et j'ai le temps d'attente

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Le i étant l'indice de la boucle, il est réinitialisé à chaque itération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> for i in range(0, 5):
    ...     print (i)
    ...     i = 10
    ...
    0
    1
    2
    3
    4
    Et pour forcer la sortie d'une boucle, vous avez "break"...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Pb Interruption thread
    Par wilv8 dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 24/06/2008, 16h07
  2. Interruption et reprise d'un Thread
    Par Nuro dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 28/02/2007, 21h34
  3. Interruption d'un Thread
    Par doudblast dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 11/03/2006, 17h30
  4. interrupt() de la classe thread
    Par canigu dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 25/12/2005, 14h01
  5. Interruption de thread
    Par bigben89 dans le forum Windows
    Réponses: 2
    Dernier message: 13/10/2005, 10h41

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