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 :

Comment relancer des threads après les avoir arrêtés


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Par défaut Comment relancer des threads après les avoir arrêtés
    Bonsoir,

    Comment peut on faire pour relancer des threads après les avoir arrêtés?

    Ci dessous le programme qui me permet de les lancer et de les arrêter.
    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
     
     
    # importations
    from tkinter import Tk, Canvas, Button
     
    import time
    import AffThread4
     
    thread2 = AffThread4.Afficheur('W')
    thread3 = AffThread4.Compteur()
     
    palette=['purple','cyan','maroon','green','red',\
    'blue','orange','yellow','dark grey']
    # --- définition des attributs de ligne et
    # des fonctions gestionnaires d'événements : ---
     
    class Menu():
     
    #    couleur = palette [c] # couleur de la ligne
     
        def marche():
            end=True
    #        thread1.start()
            thread2.start()
            thread3.start()
     
        def arret():
            end=False
    #        thread1.stop()
            thread2.stop()
            threda3.stop()
     
    #------ Programme principal -------
     
    # Création du widget principal ("maître") :
    laFenetre = Tk()
     
    # création des widgets "esclaves" :
    cannevas = Canvas(laFenetre,bg=palette[1],height=200,width=200)
    cannevas.pack(side= "left")
     
    boutonMarche = Button(laFenetre, text='Marche', command=Menu.marche)
    boutonMarche.pack(padx=10, pady=10)
     
    boutonArret = Button(laFenetre, text='Arrêt', command=Menu.arret)
    boutonArret.pack( padx=10, pady=10)
     
    boutonQuitter = Button(laFenetre, text='Quitter', command=laFenetre.quit)
    boutonQuitter.pack(side="bottom", padx=5, pady=5)
     
     
    laFenetre.mainloop () # démarrage du réceptionnaire d'événements
     
    laFenetre.destroy () # destruction (fermeture) de la fenêtre
    Ainsi que le message retourné après une tentative de Marche à nouveau.

    RuntimeError: les threads ne peuvent être démarrés qu'une seule fois
    Merci d'avance
    Cordialement

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Au lieu de lancer et d'arrêter le thread à chaque tâche, rien n'empêche d'avoir le thread actif en permanence: il faut alors définir comment on lui donne une tâche, et comment on récupère son résultat. En dehors de l'exécution de chaque tâche, il est en "attente". Un peu comme un serveur.

    Une des solutions que j'ai déjà utilisée pour ça est d'utiliser une pile pour fournir une donnée et une pile pour récupérer le résultat. Un test pour savoir si la pile n'est pas vide permet de savoir qu'une donnée est disponible. Mais comme les piles sont des données partagées entre le programme et le thread, il faut protéger les accès avec un verrou (Lock), ou alors utiliser Queue (module queue) qui fait ça très bien.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 710
    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 710
    Par défaut
    Salut,

    Citation Envoyé par mandrain Voir le message
    Comment peut on faire pour relancer des threads après les avoir arrêtés?
    On ne peut pas: lorsque le thread termine sa méthode "run", il est mort.
    Pour recommencer, il faut recréer le thread ou ajouter un Event qui permettra de suspendre/redémarrer l'activité du thread (elle reste vivante mais ne fait rien sinon attendre de pouvoir poursuivre).
    Pour les détails, voir la documentation.

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

Discussions similaires

  1. Supression de mails après les avoir lu
    Par Wilco dans le forum Delphi
    Réponses: 1
    Dernier message: 30/08/2006, 17h45
  2. [VC++/MFC] Comment faire des threads?
    Par OverLorD34 dans le forum MFC
    Réponses: 6
    Dernier message: 15/05/2006, 09h55
  3. Réponses: 4
    Dernier message: 10/05/2006, 17h19
  4. Réponses: 10
    Dernier message: 28/03/2006, 15h10
  5. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31

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