mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Un petit problème dans une boucle infinie

Wed May 23, 2018 3:06 pm

Bonjour,

Je suis un débutant avec Python 3 et Raspberry 3 B+ et j’ai quelques difficultés avec ce petit programme.
Je voudrais que la boucle while s’arrête lorsque j’appuie sur CTRL+C.
Les deux fonctions suivantes ne servent que pour les essais.
La fonction Afficheur(Thread) comme son nom l’indique n’affiche que 10 fois le caractère ‘A’.
La fonction Essais_1(Thread) fait clignoter une led .
L’ensemble me permet d’essayer les threads.
Dans ce programme l’exception ne fonctionne pas et je ne vois pas pourquoi.

Code: Select all

# -*- coding: utf-8 -*-
"""
Created on Mar Mai 22 10:30:36 2018
@author: mandrin
"""
import random
import sys
from threading import Thread
import datetime 
import time
import RPi.GPIO as GPIO #++

# broches GPIO
GPIO.setmode(GPIO.BCM) #++ GPIO21= broche 40
GPIO.setup(20, GPIO.OUT, initial=GPIO.LOW)# broche 38 LED #++

class Afficheur(Thread):

    """Thread chargé simplement d'afficher une lettre dans la console."""
    
    def __init__(self, lettre):
        Thread.__init__(self)
        self.lettre = lettre

    def run(self):
        """Code à exécuter pendant l'exécution du thread."""
        i = 0
        while i < 20:
            sys.stdout.write(self.lettre)
            sys.stdout.flush() # affichage immediat
            attente = 0.2
            attente += random.randint(1, 60) / 100 # attente aleatoire de 0.2 a 0.8 s
            time.sleep(attente)
            i += 1
# fin de Afficheur

# allumage d'une LED ==========================================================
class Essais_1(Thread):
    
    def __init__(self):
        Thread.__init__(self)
        
    def run(self):
        date=datetime.datetime.now() #*-*
        second_old=date.second+1 #*-*
        while 1:
            try:
                date=datetime.datetime.now() #*-*
                secs=int(date.second) #*-*<
                Led=date.microsecond/1e6
# commande de la LED toute les secondes (0.5s allumee, 0.5s eteinte)
                if  Led<=0.5:
                    GPIO.output(20,GPIO.LOW)# LED  allumee #++
                    pass # equiv a nop
                else:
                    GPIO.output(20,GPIO.HIGH)# LED eteinte #++
                    pass # equiv a nop                
                if secs==second_old:
                    print('secs->',secs) #*/*
                    second_old+=1  
                    if second_old==60: 
                        second_old=0                 
            except KeyboardInterrupt:
                GPIO.cleanup()
                thread_2.join()
                break

# fin de while 1 =============================================================

thread_2 = Essais_1()           
thread_3 = Afficheur("A")

# Lancement des threads
thread_2.start()
thread_3.start()

# Attend que les threads se terminent
thread_2.join()
thread_3.join()
Le seul moyen de l'arrêter est de faire un double 'reset' avec Thonny (Python 3.6)
Si quelqu'un voit pourquoi je suis preneur.
Merci d’avance
Cordialement

totoharibo
Posts: 3923
Joined: Thu Jan 24, 2013 8:43 am

Re: Un petit problème dans une boucle infinie

Wed May 23, 2018 6:31 pm

mes 2 cents : survolé d'en haut ya 2 thread à tuer
donc un
except KeyboardInterrupt
pour chacun des threads ?
et si tu n'en lance qu'un pour voir ?

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: Un petit problème dans une boucle infinie

Thu May 24, 2018 7:22 am

Bonjour,

Le thread Afficheur() ne dure que 10 secondes environ et ensuite il s'arrête.
Donc il ne reste plus que Essais_1().
Dans ce cas ^c devrait être efficace. Ce n'est pas le cas.

Cordialement
Last edited by mandrin on Thu May 24, 2018 11:29 am, edited 1 time in total.

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: Un petit problème dans une boucle infinie

Thu May 24, 2018 7:37 am

Un petit complément d'info:

Un ^C provoque bien une interruption du déroulement du thread mais celui ci reprend instantanément son déroulement.

De plus l'exception n'est pas détectée et je n'en vois pas la raison.

Cordialement

Return to “Français”

Who is online

Users browsing this forum: No registered users and 7 guests