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

Programmation multimédia/Jeux Python Discussion :

la fonction time.sleep( ) est inefficace dans mon thread


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut la fonction time.sleep( ) est inefficace dans mon thread
    Mon problème c'est que la fonction sleep ne fait pas le boulot ! aucune différence, que je mette time.sleep(2) ou time.sleep(10) !!!!
    merci pour votre aide , je ne m'en sorts 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
    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
     
    #_____________________creation d'un Thread___________________
    class generateur_coord_cell(Thread):
     
        """Thread chargé simplement de générer un nombre donné de couples de coordonnées avec un intervalle de temps(delta_t) entre deux créations fixé.,
        le thread ne se charge pas de l'affichage, du collage des images sinon il y aurait un problème de synchronisation avec le collage du fond ,
        de l'image de la cellule du joueur et le rafraichissement qui sont, eux , gérés par le programme principal"""
     
        def __init__(self,nombre, delta_t):
            Thread.__init__(self)
            self.nombre=nombre
            self.delta_t=delta_t
     
        def run(self):
            """Code à exécuter pendant l'exécution du thread."""
            global coord_cellule  # c'est une liste
            compteur_cel=0
            while compteur_cel<self.nombre:  # tant que le nombre de couples de coordonnées de cellules crés est < self.nombre
                coord_cellule.append((randint(10,890),randint(10,890))) # générer aleatoirement les coordonnées d'une nouvelle cellule
                compteur_cel+=1
                time.sleep(self.delta_t) # pause de delta_t secondes
     
     
     
    #initialisation des variables
    pos_cell_joueur=(400,400)   # position initiale de la cellule rouge
    continuer=1
    compteur_cel=0   # nombre de cellules dans le décor
    coord_cellule=[] # liste des coordonnées des cellules du décor
     
     
    ### _________________main prog_______________________________
    #______________creation du thread______________________
    thread_cellule = generateur_coord_cell(100,2)       # génère 100 coordonnées de cellules , un couple toutes les 2 secondes
     
    #_______________demarrage du thread____________________
    thread_cellule.start()
     
    while continuer==1:
        fenetre.blit(fond,(0,0))
        fenetre.blit(cell_joueur,pos_cell_joueur)
     
        for i in range(len(coord_cellule)):   #collage d'images
            if i%3==0:
                fenetre.blit(cellb,coord_cellule[i])
            elif i%3==1:
                fenetre.blit(cellj,coord_cellule[i])
            else:
                fenetre.blit(cellv,coord_cellule[i])
     
        pygame.display.flip()
        for event in pygame.event.get():
            deplacement_cell_joueur()
     
            if event.type==QUIT:
                sys.exit
                pygame.quit()
                continuer = 0

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Désolé, mais un code Python sans ses indentations est illisible: il faut le mettre entre les tags de code: c'est le '#' en haut et à droite de la fenêtre d'édition des messages.

    Sinon, je vois qu'il y a une variable globale "coord_cellule" partagée entre le thread et le programme principal: il faut protéger son accès avec un verrou (threading.Lock()) pour empêcher les tentatives d'accès au même moment.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

    Citation Envoyé par éternel apprenant Voir le message
    Mon problème c'est que la fonction sleep ne fait pas le boulot ! aucune différence, que je mette time.sleep(2) ou time.sleep(10) !!!!
    Si time.sleep ne faisait pas son boulot, çà se saurait! Par contre, possible que vous pensiez qu'avec time.sleep un de vos problèmes serait résolu... mais comme vous ne racontez pas ce que vous en attendiez, impossible de vous aider.

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

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut objectif du thread
    Bonjour Wiz,

    je souhaite avec mon thread agrandir d'un , une liste de tuples (variable partagée avec le prog principal) toutes les 2 secondes par exemple,
    précisément ce délai est un attribut du thread, appelé self.delta_t
    j'ai donc inséré dans mon thread la fonction :
    time.sleep(self_delta_t)

    et la ça ne marche pas ...je guerroie mais je n'arrive à rien, en fait c'est le premier thread que je créé...je pense que ça se voit!

    merci pour votre aide

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par éternel apprenant Voir le message
    et la ça ne marche pas ...je guerroie mais je n'arrive à rien, en fait c'est le premier thread que je créé...je pense que ça se voit!
    Quand vous avez ce genre d’interrogation, c'est facile de tester en écrivant un bout de code qui vérifie que çà fait bien ce que vous attendiez:
    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
    40
    from threading import Thread
    from random import randint
    import time
     
    class generateur_coord_cell(Thread):
     
        """Thread chargé simplement de générer un nombre donné de couples de coordonnées avec un intervalle de temps(delta_t) entre deux créations fixé.,
        le thread ne se charge pas de l'affichage, du collage des images sinon il y aurait un problème de synchronisation avec le collage du fond ,
        de l'image de la cellule du joueur et le rafraichissement qui sont, eux , gérés par le programme principal"""
     
        def __init__(self,nombre, delta_t):
            Thread.__init__(self)
            self.nombre=nombre
            self.delta_t=delta_t
     
        def run(self):
            """Code à exécuter pendant l'exécution du thread."""
     
            compteur_cel=0
            while compteur_cel<self.nombre:  # tant que le nombre de couples de coordonnées de cellules crés est < self.nombre
                coord_cellule.append((randint(10,890),randint(10,890))) # générer aleatoirement les coordonnées d'une nouvelle cellule
                compteur_cel+=1
                print('+', coord_cellule)  # c'est une liste
                time.sleep(self.delta_t) # pause de delta_t secondes
     
     
     
    coord_cellule=[] # liste des coordonnées des cellules du décor
     
     
    ### _________________main prog_______________________________
    #______________creation du thread______________________
    thread_cellule = generateur_coord_cell(10, 0.5)       # génère 100 coordonnées de cellules , un couple toutes les 2 secondes
     
    #_______________demarrage du thread____________________
    thread_cellule.start()
     
    while thread_cellule.is_alive():
          print ('*', coord_cellule)
          time.sleep(1)
    Pour moi, çà le fait... d'où mon incompréhension sur le problème que vous cherchiez à résoudre (il est ailleurs).

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

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut


    au tout début le délai entre l'apparition entre 2 cellules (disque de couleur) est bien de 2 secondes puis ça s'emballe, 2 ou 3 cellules apparaisent d'un coup, et puis s'est anarchique.
    quelqu'un a-t-il une idée ?
    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
    verrou=threading.Lock()
    #_____________________creation d'un Thread___________________
    class generateur_coord_cell(Thread):
     
        """Thread chargé simplement de générer un nombre(nombre) donné de couples de coordonnées avec un intervalle de temps(delta_t) entre deux créations fixé.,
        le thread ne se charge pas de l'affichage, du collage des images sinon il y aurait un problème de synchronisation avec le collage du fond ,
        de l'image de la cellule du joueur et le rafraichissement qui sont, eux , gérés par le programme principal"""
     
        def __init__(self,nombre, delta_t):
            Thread.__init__(self)
            self.nombre=nombre
            self.delta_t=delta_t
     
        def run(self):
            """Code à exécuter pendant l'exécution du thread."""
            global coord_cellule     # liste de tuples partagée avec le programme principal, il va falloir la verrouiller pour éviter un accès simultané du thread et du prog ppal.
            compteur_cel=0
            global t0
            while compteur_cel<self.nombre:  # tant que le nombre de couples de coordonnées de cellules crés est < self.nombre
                verrou.acquire()   # verrouille l'accès à la variable global coord_cellule pour le prog principal
                coord_cellule.append((randint(10,890),randint(10,890))) # générer aleatoirement les coordonnées d'une nouvelle cellule
                verrou.release()   # libere l'accès à la variable global coord_cellule
                compteur_cel+=1
                time.sleep(self.delta_t)   # pause

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par éternel apprenant Voir le message
    au tout début le délai entre l'apparition entre 2 cellules (disque de couleur) est bien de 2 secondes puis ça s'emballe, 2 ou 3 cellules apparaisent d'un coup, et puis s'est anarchique.
    Côté Python, les ajouts/suppression dans une liste sont déjà "atomiques"... donc ajouter un verrou ne changera rien... Par contre, il semble que vous soyez bien plus préoccupé par les mises à jours côté affichage mais cela et les ajouts réguliers dans votre liste sont 2 problèmes différents.

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

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut merci pour cette analyse . je vais reorienter mes recherches...
    merci pour cette analyse . je vais reorienter mes recherches...

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Tant qu'a faire regardez aussi du côte de pygame.time.settimer.
    Cela vous éviterait d'utiliser des threads (vous ne connaissez pas) et à mieux utiliser les fonctionnalités de pygame (plus difficile de vous en passer).

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

Discussions similaires

  1. fonction explode() ne fonctionne pas dans mon code
    Par Invité dans le forum Langage
    Réponses: 12
    Dernier message: 08/02/2013, 10h34
  2. activer fonction quand checkbox est cochée dans formulaire php
    Par knebhi dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 06/10/2010, 11h26
  3. default.aspx n'est pas dans mon projet vs2010
    Par Golzinne dans le forum Silverlight
    Réponses: 7
    Dernier message: 21/06/2010, 11h18
  4. Une iframe est apparu dans mon code !
    Par Ariochs dans le forum Sécurité
    Réponses: 5
    Dernier message: 03/05/2010, 17h46
  5. Quitter une fonction qui fait une boucle dans le Thread ?
    Par bboy0303 dans le forum Multithreading
    Réponses: 2
    Dernier message: 25/05/2009, 17h58

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