Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arrêt d'un thread depuis un autre thread

    25 mars 2019 à 12:42:40

    Bonjour à tous !

    C'est mon premier post sur le forum j'ai un petit souci avec l'activité finale du cours Python (amélioration du Labyrinthe).

    Avant le début de partie, les clients connectés au serveur ont la possibilité de lancer la partie en appuyant sur C. Le problème est le suivant :

    Dans le code client, j'ai créé 2 threads, le premier avec la fonction input(), qui attend que le client appuie sur C. Le second qui attend la réception d'un message du serveur signifiant qu'un autre joueur a appuyé sur C, et que la partie doit commencer. Idéalement, ce message est reçu, il faudrait que le second thread puisse mettre fin au premier (car il ne sert plus à rien d'attendre que le joueur appuie sur C, et il est temps de passer à la suite du code).

    Or, je ne vois pas comment procéder, il paraît que stopper brutalement un thread est mal vu en général (avec la fonction _stop()).

    Peut-être y a-t-il d'autres solutions à ce souci ?

    Merci beaucoup à ceux qui apporteront leur aide.

    • Partager sur Facebook
    • Partager sur Twitter
      25 mars 2019 à 13:27:28

      Le premier thread ne peut pas s'arrêter dès que le joueur a appuyé sur C ?
      • Partager sur Facebook
      • Partager sur Twitter
        6 avril 2019 à 19:08:58

        Si, et cette condition serait facile à coder. Le problème viendrait du cas où où le joueur n'a pas appuyé sur C, et que le thread doit néanmoins s'arrêter car un autre joueur a cliqué sur C. Le thread serait en quelque sorte "bloqué" sur input() alors que la partie doit commencer
        • Partager sur Facebook
        • Partager sur Twitter
          6 avril 2019 à 20:41:03

          Hello, perso j'irai voir la classe Queue de ptthon pour implémenter une boucle infinie de threads qui gèrent l input, eux même dans la boucle du jeu du client.

          Les threads ne soccupent que de récupérer l input, et l affichage se rafraîchit automatiquement depuis la boucle principale (qui va recuperer les messages, mettre a jour laffichage et envoyer des messages), que l'utilisateur ait appuyé sur telle commande ou pas.

          Du coup linput serait toujours disponible mais les instructions sur les commandes attendues changeraient grâce à l'affichage. 

          • Partager sur Facebook
          • Partager sur Twitter

          Mikael Briolet

          Anonyme
            7 avril 2019 à 4:19:09

            Ça ne serait pas plus logique que le serveur attende que tous les joueurs soient prêts avant de commencer ?

            Quoi qu'il en soit, Il faut bien comprendre que le terminal (ou l'invite de commande) est une interface utilisateur conçue pour interpréter/exécuter des commandes ligne par ligne. Pour des usages plus interactifs, il faut utiliser ou créer des bibliothèques dédiées nommées TUI (Interface Utilisateur en mode Texte, utilisable dans un environnement de type terminal) ou GUI (Interface Utilisateur en mode Graphique, utilisable dans un environnement de type fenêtré).

            Typiquement, un jeu de labyrinthe n'est pas adapter à la ligne de commande, qu'il soit en réseau ou non. Se déplacer à coup de input() est une aberration. Cette fonction ne sert que pour de la saisie de ligne de commande.

            Ça ne veut pas dire que l'on ne peut pas ou ne doit pas réaliser des programme interactifs pour terminal, ça veut juste dire qu'il faut utiliser des bibliothèques adaptées, par exemple NCurses pour les terminaux Unix ou PDCurses pour l'invite de commande de Windows.

            Et là on se rend compte que trouver une bibliothèque TUI portable (qui fonctionne sur tous les OS et terminaux) est bien plus difficile que de trouver une bibliothèque GUI portable.

            Pour conclure, utilise Tkinter, c'est plus simple et c'est portable.

            -
            Edité par Anonyme 7 avril 2019 à 4:21:07

            • Partager sur Facebook
            • Partager sur Twitter
              7 avril 2019 à 11:37:14

              "Typiquement, un jeu de labyrinthe n'est pas adapter à la ligne de commande, qu'il soit en réseau ou non. Se déplacer à coup de input() est une aberration. Cette fonction ne sert que pour de la saisie de ligne de commande."

              Certainement, mais c'est ce qui est demandé par l'activité du cours donc bon.

              -
              Edité par thelinekioubeur 7 avril 2019 à 11:38:06

              • Partager sur Facebook
              • Partager sur Twitter

              Arrêt d'un thread depuis un autre thread

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown