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 :

Problème Boucle qui ralenti le Rafraîchissement


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 67
    Points : 49
    Points
    49
    Par défaut Problème Boucle qui ralenti le Rafraîchissement
    Bonjour à tous

    j'ai un soucis de lenteur de rafraîchissement de ma fenêtre root

    J'ai mon appli fonction ainsi
    je reçois des informations text via socket celle ci change lorsque je demande la page concerner via des Bouton switch avec GPIO pour se faire j'utilise ce code

    Code python : 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
     
    from threading import Thread
    import RPi.GPIO as GPIO
    import time
    import socket
    import sys 
     
    hote ="192.168.1.21"
    port =9000
    socket3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket3.connect((hote, port))
    ActiveFunc = 1 
     
    GPIO.setmode(GPIO.BCM)
    MATRIX = [[308,309,310], #entier envoyé correspondant au pages
             [311,311,312],
             [255,256,303]]
     
    ROW = [18,23,24]
    COL = [22,27,12]
     
    for j in range(3):             
        GPIO.setup(COL[j], GPIO.OUT)
        GPIO.output(COL[j],1)
     
        for i in range(3):
     
            GPIO.setup(ROW[i],GPIO.IN, pull_up_down = GPIO.PUD_UP)
     
     
     
    class Worker(Thread):
        def run(self):
            try:
     
                while(True):
                    for j in range(3):
                        GPIO.output(COL[j],0)
                        for i in range(3):                        
                            if GPIO.input(ROW[i]) == 0:
     
                                ActiveFunc= '1'
                                SWnbr=str(MATRIX[i][j])
                                SWdir='3'
     
                                txt=SWnbr+'\r''\n'
                                print(len(txt))#juste pour info
                                print(txt)#juste pour info
                                socket3.send(txt.encode('utf_8'))
     
                                while(GPIO.input(ROW[i]) == 0):
                                   time.sleep(1.2) # pause trop longue pour le bon fonctionnement de la boucle de la matrice
                                    pass
                        GPIO.output(COL[j],1)
     
            except KeyboardInterrupt:
                    GPIO.cleanup()
     
     
     
                    return
     
    Worker().start()


    Mon Problème c'est que le rafraîchissement de mes labels soit 336 label ralenti fortement des que la boucle time.sleep(1.2) est inférieur à cette valeur comme si la boucle while gênait le thread de rafraîchissement des labels. mon soucis est que la valeur de 1.2 est trop longue pour mon fonctionnement optimum de mon GPIO

    je ne comprend pas pourquoi vu que ma boucle est dans un Thread et mon rafraîchissement aussi

    Si vous avez une idée SVP

    Cordialement
    Oscar

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Oscar02 Voir le message
    je ne comprend pas pourquoi vu que ma boucle est dans un Thread et mon rafraîchissement aussi
    Si les Labels sont ceux d'une interface graphique qui tourne dans le même processus que ce thread là, ils partagent le même CPU (à cause du GIL).
    Et si vous diminuez la durée du time.sleep, le thread consomme plus et il en reste moins pour le reste.

    Il va falloir revoir votre code pour qu'il soit un peu moins gourmand en CPU, car il n'est pas "open bar".

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

  3. #3
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 67
    Points : 49
    Points
    49
    Par défaut
    Merci pour votre aide

    effectivement j'ai remplacer les Treads par des process avec la bibliotheque multiprocessing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from multiprocessing import Process
     
    def f(x):
       #mon code
     
    if __name__ == '__main__':
        p = Process(target=f, args=('',))
        p.start()
        p.join()
    voila tous fonctionne encore quelques améliorations à faire

    Cordialement

    Oscar

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Oscar02 Voir le message
    effectivement j'ai remplacer les Treads par des process avec la bibliotheque multiprocessing
    Beurk.
    Ajouter un time.sleep petit à chaque itération pour libérer un peu de CPU aurait pu suffire!

    Quel intérêt de faire une boucle pour tester toutes les nano-secondes quelque chose change toutes les
    millisecondes (sinon de bouffer 1000 fois plus de CPU pour rien)?

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

  5. #5
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 67
    Points : 49
    Points
    49
    Par défaut
    Salut

    Merci de votre intérêt à mon problème

    mais comme je l'ai précisé je ne maîtrise pas du tous Python je crée une appli déjà écrite pour Androïd en delphi pour l'utiliser sur raspberry et j'avoue que j'ai du mal avec se langage
    effectivement ça marche mieux mais tu as raison je consomme 20% de CPU et lorsque je ferme mon aplli mon 2eme process ne se ferme pas

    un petit coup de main n'est pas de refus

    cordialement

    Oscar

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Oscar02 Voir le message
    lorsque je ferme mon aplli mon 2eme process ne se ferme pas
    Si c'est un process, la documentation vous explique comment le "tuer". Si c'est un thread, ajoutez un Event à tester à chaque itération pour signaler la sortie du programme.

    Citation Envoyé par Oscar02 Voir le message
    je l'ai précisé je ne maîtrise pas du tous Python je crée une appli déjà écrite pour Androïd en delphi pour l'utiliser sur raspberry et j'avoue que j'ai du mal avec se langage
    threads, process, .... sont des objets systèmes et se gèrent de la même façon quelque soit le système.
    Ce qui est spécifique à Python, c'est comment les utiliser pour le programmeur Python, et çà c'est dans la documentation des bibliothèques.

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

  7. #7
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 67
    Points : 49
    Points
    49
    Par défaut
    Salut,

    J'ai modifier mon code avec vos conseille effectivement j'ai changer au lieu d'utiliser 2 process je suis revenu sur le thread et j'y est ajouté un time sleep maintenant mon appli avec la boucle et le rafraichissement ne consomme que 6% et fonctionne correctement par contre le thread Gpio ne s'arrete pas a la fermeture du programme.

    Je ne sait pas si c'est pour cette raison?

    Mon code Gpio avec ma boucle est un fichier .py que j'importe via import xxx.py (cela me parait plus lisible)
    Il demarre correctement mais continu quand je ferme l'appli principale avec mon affichage tkinter

    Je continue mes recherches en suivant vos conseilles

    Merci encore

    Cordialement
    Oscar

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

Discussions similaires

  1. [Batch] Problème boucle qui se finit sans traiter le dernier élément
    Par Ry0_Saeba dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 09/11/2018, 00h05
  2. C++ problème de boucle qui bloque l'appli
    Par ame_12 dans le forum C++
    Réponses: 2
    Dernier message: 03/07/2013, 16h22
  3. Problème actionscript qui boucle
    Par baleiney dans le forum Flash
    Réponses: 1
    Dernier message: 26/03/2007, 07h44
  4. Réponses: 10
    Dernier message: 07/01/2007, 12h03
  5. [problème Free]boucle qui ne marche plus
    Par xender dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/12/2006, 14h43

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