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 :

Code bloquant comment le contourner? [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai Avatar de Boudha25
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    janvier 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : janvier 2019
    Messages : 30
    Points : 21
    Points
    21
    Par défaut Code bloquant comment le contourner?
    Bonjour, j'ai un programme qui détecte un mouvement avec un détecteur PIR. Lors de la détection, je lance un fonction de lecture sur une antenne RFID. Si la personne possède une carte RFID valide tout va bien. Je n'ai pas mis tout le code, car je vais vérifier dans une base de donnée, mais ce n'est pas utile pour mon problème. Le problème est que si la personne est détecté avec le détecteur PIR et qu'elle n'a pas de carte RFID, la fonction lire attend la lecture d'une carte RFID. J'aimerais savoir comment je peux contourner ce problème de fonction qui bloque. j'aimerais que si il y a détection avec le PIR et que la personne n'a pas de RFID, que le programme continue avec exemple allumer une lumière rouge. J'espère être asser clair dans ma question. Voici le code simplifié. J'ai besoin de savoir si il y a une fonction ou un truc quelconque qui permettrais d'empêcher la fonction de bloquer en attendant la lecture d'une carte RFID. Merci.

    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
    import RPi.GPIO as GPIO
    from mfrc522 import SimpleMFRC522
    import time
     
     
    CardReader = SimpleMFRC522()
    print ('Scanning for a  card..')
    print ('to cancel press ctrl+c')
     
    def lire():
        try:
            id, text = CardReader.read()
            print (id)
            print(text)
     
        except KeyboardInterrupt:
            print("arret clavier")
     
        finally:
                GPIO.cleanup()
     
    def detection():
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(11, GPIO.IN)         #Read output from PIR motion sensor
        GPIO.setup(3, GPIO.OUT)         #LED output pin
        i=GPIO.input(11)
        if i==0:                 #When output from motion sensor is LOW
            print("No intruders"),i
            GPIO.output(3, 0)  #Turn OFF LED
            time.sleep(0.1)
        elif i==1:               #When output from motion sensor is HIGH
            print("Intruder detected"),i
            GPIO.output(3, 1)  #Turn ON LED
            lire()
            time.sleep(0.1)
     
    while True:
        detection()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 424
    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 : 18 424
    Points : 31 845
    Points
    31 845
    Par défaut
    Salut,

    Citation Envoyé par Boudha25 Voir le message
    J'aimerais savoir comment je peux contourner ce problème de fonction qui bloque.
    On ne peut pas "contourner" mais gérer avec un timeout...
    Reste à savoir si vous voulez ajouter un timeout à n'importe quelle fonction ou à une fonction particulière (qui le gère peut être déjà).

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

  3. #3
    Membre averti Avatar de LeNarvalo
    Homme Profil pro
    Amateur Python
    Inscrit en
    février 2014
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Amateur Python
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 254
    Points : 448
    Points
    448
    Par défaut
    Bonjour,

    Si ça peut aider un pro à te répondre : https://github.com/pimylifeup/MFRC52...mpleMFRC522.py

    Une solution pas terrible pourrait être de générer un KeyboardInterrupt, si jamais le module mfrc522 ne gère pas ce que tu veux...


  4. #4
    Membre à l'essai Avatar de Boudha25
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    janvier 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : janvier 2019
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Merci Wiztricks,

    Je vais explorer le timeout. J'ai trouvé ce bout de code qui fonctionne dans mon exemple. Je vais l'adapter a mon projet. Pour répondre à ta question, c'est la fonction lire qui doit avoir un timeout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if __name__ == '__main__':
        # We create a Process
        action_process = Process(target=do_actions)
     
        # We start the process and we block for 5 seconds.
        action_process.start()
        action_process.join(timeout=5)
     
        # We terminate the process.
        action_process.terminate()
        print("Hey there! I timed out! You can do things after me!")

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 424
    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 : 18 424
    Points : 31 845
    Points
    31 845
    Par défaut
    Salut,

    Citation Envoyé par Boudha25 Voir le message
    J'ai trouvé ce bout de code qui fonctionne dans mon exemple. Je vais l'adapter a mon projet. Pour répondre à ta question, c'est la fonction lire qui doit avoir un timeout.
    Dans la fonction lire, ce qui peut bloquer, c'est l'appel CardReader.read().

    A priori, il y a un edit de la bibliothèque qui devrait le permettre et s'utiliser via CardReader.read(timeout=5).

    Voir si vous avez les dernières versions (qui ajoutent cette fonctionnalité).

    Comme c'est une communication avec une carte, il vaut mieux le faire avec ça qu'ajouter un timeout au dessus: juste pour remettre la carte dans un état "normal".

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

  6. #6
    Membre à l'essai Avatar de Boudha25
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    janvier 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : janvier 2019
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par wiztricks Voir le message

    Voir si vous avez les dernières versions (qui ajoutent cette fonctionnalité).
    J'ai installé la dernière version de la bibliothèque (Latest commit f8cefd6 on 1 Apr 2019) et elle ne contient pas le code du timeout. Est-ce que je devrais ajouter le code que tu as mis en lien dans la bibliothèque?

    https://github.com/pimylifeup/MFRC52...522/MFRC522.py

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 424
    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 : 18 424
    Points : 31 845
    Points
    31 845
    Par défaut
    Citation Envoyé par Boudha25 Voir le message
    Est-ce que je devrais ajouter le code que tu as mis en lien dans la bibliothèque?
    Apparemment, cette modification n'a pas été intégrée dans la distribution standard. Essayez de contacter le développeur pour savoir pourquoi et/ou essayez son code.
    note: comme je ne dispose pas du matériel qui pourrait me permettre de tester, je ne peux pas grand chose de plus.

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

  8. #8
    Membre à l'essai Avatar de Boudha25
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    janvier 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : janvier 2019
    Messages : 30
    Points : 21
    Points
    21
    Par défaut Merci
    Citation Envoyé par wiztricks Voir le message
    note: comme je ne dispose pas du matériel qui pourrait me permettre de tester, je ne peux pas grand chose de plus.
    Même si vous n'avez pas le matériel, vous avez su me guider pour résoudre mon problème. Merci!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/08/2009, 19h16
  2. Code à expliquer, commenter
    Par Boubou382002 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 27/11/2008, 00h28
  3. Attente bloquante : comment faire?
    Par ®om dans le forum Général Java
    Réponses: 14
    Dernier message: 25/09/2006, 10h28
  4. Réponses: 1
    Dernier message: 09/05/2006, 13h22
  5. Duplication code css, comment y remédier ?
    Par sunshine33 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 26/04/2006, 14h53

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