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 :

[Aide] récupérer variable d'un thread


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    agent sncf
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : agent sncf
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut [Aide] récupérer variable d'un thread
    Bonjour,

    Dans mon programme, j'ai besoin de plusieurs temporisation, du coup je me suis servi des threads. Mais le problème c'est que je n'arrive pas à récupérer les variables qui change dans mon thread, j'ai dû raté une étape. Une de mes temporisations me permet de faire clignoter mes boutons, je pense que si j'arrive à résoudre ce problème, ça devrait aussi régler mes autre temporisations.

    Voici mon code fichier temporisation.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def clignotement():
        global etat, continuer
        while continuer:
            etat = 0
            pygame.time.wait(500)
            etat = 1
            pygame.time.wait(500)
     
    cligote = Timer(0.1, clignotement)
    cligote.start()
    Mon programme principal:
    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
        if __name__ == '__main__':
            if temporisation.etat == 0:
    #Bouton d itineraire
                if  IT_RP_4T == "CLI_RP_4T":
                   pygame.display.update(fenetre.blit(Bouton_4T_a, (F_4T, O_RP)))
     
                if IT_RP_JC2 == "CLI_RP_JC2":
                    pygame.display.update(fenetre.blit(Bouton_JC2_DA_a, (F_JC2_DA, O_RP)))
     
            if temporisation.etat == 1:
    #Bouton d itineraire
                if  IT_RP_4T == "CLI_RP_4T":
                   pygame.display.update(fenetre.blit(Bouton_4T_e, (F_4T, O_RP)))
     
                if IT_RP_JC2 == "CLI_RP_JC2":
                    pygame.display.update(fenetre.blit(Bouton_JC2_DA_e, (F_JC2_DA, O_RP)))
    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    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 701
    Par défaut
    Salut,
    Lorsque pygame.time.wait(500) est appelé, le thread pygame est suspendu 500ms. Vous ecrivez:
    Dans mon programme, j'ai besoin de plusieurs temporisation, du coup je me suis servi des threads.
    d'accord mais si vous appelez pygame.time.wait(500) alors que pygame attend déjà la fin de l'appel précédent (grâce aux threads), ca fait quoi?
    La "temporisation" peut s'exprimer par lancer telle action dans 200ms puis celle ci dans 400ms. Ordonnancer le déclenchement d'actions permet de faire autre chose en attendant. En programmation graphique, il vaut mieux attendre l’arrivée d'un événement qu'attendre que le temps passe.

    Je ne connais pas assez pygame pour être sur que son event-loop ne propose pas déjà une solution prête a l'emploi. Sinon, on peut appeler une fonction qui s'occupe de lancer les actions (via un USEREVENT déclenche par pygame.set_timer). Ou si on a peut d'event, utiliser la possibilité de poster plusieurs USERVENT.

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

  3. #3
    Membre averti
    Homme Profil pro
    agent sncf
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : agent sncf
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Bonjour,

    Merci pour votre réponse. Par contre je n'ai pas trouver beaucoup de chose sur "event-loop" du coup je me suis rabattu sur le "USEREVENT" mais ne le connaissant pas j'ai adapter un code que j'ai trouver mais ça ne marche pas
    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
     
    pygame.time.set_timer(USEREVENT+1, 500)
     
    def tempocli():
        global etat, continuer
        for event in pygame.event.get():
            if event.type == USEREVENT+1:
                if etat == 0:
                    etat = 1
                    return etat
                elif etat == 1:
                    etat = 0
                    return etat
            if event.type == QUIT:
                break
    Ma fonction se lance bien après vérification avec des essais.

    Merci d'avance.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    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 701
    Par défaut
    Salut,
    "ca ne marche pas" est un peu trop vague.
    Je suppose que ça signifie que "pygame.time.set_timer(USEREVENT+1, 500)" ne va poster qu'un seul "USEREVENT+1".
    De toutes façons, comme vous ramenez la variable globale "etat" dans le truc, c'est qu'on ne s'est pas compris.
    Essayez de faire marcher le code suivant (fait avec des cut&paste et sans tests, l'important est l'idee):
    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
    def on_blink_off():
                if  IT_RP_4T == "CLI_RP_4T":
                   pygame.display.update(fenetre.blit(Bouton_4T_a, (F_4T, O_RP)))
     
                if IT_RP_JC2 == "CLI_RP_JC2":
                    pygame.display.update(fenetre.blit(Bouton_JC2_DA_a, (F_JC2_DA, O_RP)))
    def on_blink_on():
     
               #Bouton d itineraire
                if  IT_RP_4T == "CLI_RP_4T":
                   pygame.display.update(fenetre.blit(Bouton_4T_e, (F_4T, O_RP)))
     
                if IT_RP_JC2 == "CLI_RP_JC2":
                    pygame.display.update(fenetre.blit(Bouton_JC2_DA_e, (F_JC2_DA, O_RP)))
    BLINK_ON = USEREVENT+1
    BLINK_OFF= USEREVENT+2
     
    def mainloop():
        for event in pygame.event.get():
            if event.type == BLINK_OFF:
               on_blink_off()
               pygame.time.set_timer(BLINK_ON, 500)
            elif event.type == BLINK_ON:
               on_blink_on()
               pygame.time.set_timer(BLINK_OFF, 500)
            elif event.type == QUIT:
                break
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    agent sncf
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : agent sncf
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Bonjour,

    Merci pour cette aide, j'ai retourner le code mais en vain, à aucun moment je n'ai réussi à le faire marcher.

    Le problème vient de cette portion de code enfin je l'espère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def mainloop():
        for event in pygame.event.get():
            if event.type == BLINK_OFF:
               on_blink_off()
               pygame.time.set_timer(BLINK_ON, 500)
            elif event.type == BLINK_ON:
               on_blink_on()
               pygame.time.set_timer(BLINK_OFF, 500)
            elif event.type == QUIT:
                break
    J'arrive à bien lancer la fonction, mais je n'arrive pas à obtenir ces conditions de vraie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            if event.type == BLINK_OFF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d
            elif event.type == BLINK_ON:
    Malgré mes recherche je n'ai pas trouvé pas trouvé de réponse au problème.

    Merci

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    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 701
    Par défaut
    Salut,
    oui c'est de la daube, il faut que je revoie ma copie
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre averti
    Homme Profil pro
    agent sncf
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : agent sncf
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Je continue mes recherches et test mais toujours rien de concluant....

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    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 701
    Par défaut
    Salut,
    Ayant en ce moment d'autres sujets d'occupation, pas le temps de regarder plus en avant. Les deux questions "PyGame" pour lesquelles je n'ai pas (encore) trouve de réponse sont:
    • Existe-t-il une façon supportée pour soumettre l’exécution de "callbacks" après un délai donné?
    • Sinon, est-ce que "PyGame" supporte les threads, i.e. la possibilité d’exécuter un callback qui appelle des méthodes "PyGame" depuis un autre "thread"

    La quantité de code (et ses complications) dépendent de ces réponses.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre averti
    Homme Profil pro
    agent sncf
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : agent sncf
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Salut,

    Je ne saurais pas répondre à tes questions.

    Pour mon problème j'ai réussi à faire ce que je voulais, j'ai magouiller un truc qui marche, après je ne sais pas si c'est propre mais ça marche!!!

    Pour résumé voilà ce que j'ai fais:

    J'ai créer une variable qui s'incrémente toute les 100ms:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if etat == 0:
        pygame.time.wait(50)
        etat = 1
        i += 1
    elif etat == 1:
        pygame.time.wait(50)
        etat = 0
    Lorsque je veux lancer ma temporisation je récupère la valeur de ma variable i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    elif IT_RP_4T == "ET_RP_4T" and EPA_302 == "EPA_302_ROUGE" and FC_302 == True: # si litineraire est forme et l Epa au rouge avec le fc de commande on lance la tempo
        EPA_302_TEMPO = i
        TEMPO_302 = True
    Puis pour terminer je rajouter dans une condition mon temps de temporisation à la valeur récupérer dans ma variable i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if TEMPO_302 == True and i == EPA_302_TEMPO + 50: #tempo environ 5second voir 6 a confirner et a ajuster.
        EPA_302 = "EPA_302_BLANC"
    Après je me pose une question jusqu'à combien ma constante 1 peut s'incrémenter? Est-ce que si le programme tourne pendant 8H non stop, il ne plantera pas vu la valeur de "i"?

    Merci.

Discussions similaires

  1. Récupérer variables d'1 <form> et les utiliser dans X
    Par honeyz dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/04/2006, 11h39
  2. Récupérer variable d'un document enfant sur doc parent ?
    Par renaud26 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/03/2006, 14h22
  3. [SQL*PLUS] Récupérer variable
    Par tonysky dans le forum Oracle
    Réponses: 4
    Dernier message: 15/02/2006, 07h56
  4. [ActionScript] Récupérer variable dans URL
    Par JohnBlatt dans le forum Flash
    Réponses: 2
    Dernier message: 20/07/2005, 10h21
  5. Variable static avec thread
    Par oxor3 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 27/08/2004, 11h45

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