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 :

Lecture perpetuelle d'un "device file" sur linux


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut Lecture perpetuelle d'un "device file" sur linux
    Bonsoir,

    Je suis en train de travailler sur l'utilisation d'une manette dans un programme, étant sur Ubuntu, j'utilise le fichier "/dev/input/js0" qui transmet chaque signale.
    J'arrive à lire ces signaux sans problème, seulement, lorsqu'il n'y en a aucun, f.read() reste en suspend et le programme ne peut plus rien faire avant l'arrivée d'une autre information.
    Je n'arrive pas à trouver dans la doc une explication (je suspecte le manque d'un caractère de fin de fichier, qui du coup causerait la lecture en boucle d'un fichier vide).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    running = True
     
    with open("/dev/input/js0", "rb") as f:
        while running:
     
            f.read(8)
     
            pygame.display.flip()
            clock.tick(30)
     
        pygame.quit()
    Dans cette exemple, la fenêtre pygame ne peut pas se mettre à jour tant que la manette n'envoie aucune information...

    Merci pour votre attention

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

    Citation Envoyé par lefou123456 Voir le message
    J'arrive à lire ces signaux sans problème, seulement, lorsqu'il n'y en a aucun, f.read() reste en suspend et le programme ne peut plus rien faire avant l'arrivée d'une autre information.
    Par défaut, les lectures attendent qu'il y ait de quoi lire.

    Pour gérer çà, vous avez 2 sortes de solutions, pousser la lecture dans un thread (si elle bloque, le thread principal lui continue) qui remplit une Queue.
    Le thread principal pourra tester s'il y a de quoi lire où lire avec un timeout.

    Ou bien puisque vous êtes sous Linux, récupérer le fileno, rendre les lectures non bloquantes via fnctl.

    Pour les détails, cherchez un peu sur Internet, vous avez plein d'exemples.

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut
    Merci wiztricks

    J'ai utilisé un autre thread pour éviter de bloquer le principal.
    Voici mon code final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import _thread
     
    def handle_controller():
        with open("/dev/input/js0", "rb") as f:
            while True: 
                print([ ord(f.read(1)) for _ in range(8) ])
     
    _thread.start_new_thread(handle_controller, ())
     
    while running:   
        pygame.display.flip()
        clock.tick(30)
    Bonne soirée.

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

Discussions similaires

  1. Copie Data File Raw Device --> File en Aix 5.3 / 9i
    Par Merilka dans le forum Administration
    Réponses: 4
    Dernier message: 12/09/2007, 11h48
  2. [Quote] DVP quoté sur Bashfr
    Par Skyounet dans le forum La taverne du Club : Humour et divers
    Réponses: 16
    Dernier message: 26/09/2006, 18h52
  3. Quotes sur des valeurs numériques
    Par shadeoner dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 05/05/2006, 14h56

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