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

Langage Java Discussion :

Interrompre l'execution d'un programme jusqu'a action de l'utilisateur


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Par défaut Interrompre l'execution d'un programme jusqu'a action de l'utilisateur
    Bonjour,

    Je programme un jeu de dame. Pour faire jouer un joueur, mon programme appelle la méthode jouer d'une classe joueur. Cette classe joueur peut tout aussi bien être un humain qu'un ordinateur. Quand c'est le tour de l'IA, aucun problème la fonction execute son traitement et renvoit le coup joué. En revanche quand c'est à l'humain de jouer, il faut attendre que l'utilisateur interagisse avec l'interface grapique.
    Pour l'instant ma solution a été de mettre dans la classe qui contient la fonction jouer, une variable booléenne qu'un ActionListener vient modifier quand l'utilisateur a définit un coup, et de faire un while(actif) dans la fonction jouer.
    Ce sera certainemen plus clair avec un résumé du code :

    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
     
    class Humain extends Joueur{
      boolean actif = true;
      Coup coup_choisi;
     
      public Coup jouer(){
        //On met en place les ActionListener
        while(actif);
        return coup_choisi;
      }
    }
     
    class Ecoutre implements ActionListener{
      public void ActionPerformed(ActionEvent e){
        //Met à jour coup choisi
        //Met actif à false
      }
    }
    Voilà le principe général de la fonction. J'avais pensé à faire de Joueur un Thread mais il ne faut pas que le programme principal continue de tourner pendant que la fonction jouer est appelée.
    Le problème du while(actif) c'est que j'ai l'impression qu'il fait un peu "ramer" le PC. Je n'ai pas l'impression que ce soit une solution très propre.
    Y-a-t-il un moyen d'interrompre l'execution d'un programme tant qu'une action n'a pas été effectué ?

    Merci

  2. #2
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    J'avoue ne pas très bien comprendre pourquoi tu veux interrompre l'exécution de ton programme.

    Néanmoins, j'ai une bonne nouvelle : à vue de nez, tu n'as rien a faire. En effet, je crois comprendre que tu as une GUI, qui attend l'apparition d'une action (le coup). Et, tant que ton programme attend, on peut considérer qu'il ne fait rien. Exactement comme toi quand tu attends le bus.

  3. #3
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Le problème est que tu veux définir une méthode synchrone d'attente d'une action utilisateur alors que l'interface graphique est de type événementiel : les traitements relatifs aux événements sont à réaliser à l'intérieur des listeners.
    Quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Coup jouer(){
        while(actif);
        return coup_choisi;
      }
    tu fais une attente active dans la boucle while, i.e. le processeur va tourner à vide, c'est pour cela que ton PC rame.
    En respectant l'approche événementiel de Swing, il faudrait plutôt faire qq chose comme ça :
    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
    class Joueur {
      public Coup jouer() {
        coupChoisi = ...;
        return coupChoisi;
      }
    }
     
    class Humain extends Joueur implements ActionListener {
      private Coup coupChoisi;
     
      public Coup jouer() {
        //On met en place les ActionListener
        ...
     
        // On pose un verrou sur this et on se met en attente
        coupChoisi = null;
        synchronized(this) {
          while (coupChoisi == null) {
            try {
              wait();
            } catch (InterruptedException ie) {}
          }
        }
     
        //On retire les ActionListener
        ...
     
        return coupChoisi;
      }
     
      public void ActionPerformed(ActionEvent e) {
        Coup coupChoisi = ...;
     
       // On réveille le thread chargé de renvoyer le coup choisi
       synchronized(this) {
          notify();
        }
      }
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Par défaut
    Ok merci beaucoup c'est exactement ça que je cherchais, "endormir" le programme principal jusqu'à ce qu'un evennement le réveille.
    Merci encore

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/06/2005, 20h02
  2. [Debutant] execution d'un programme console
    Par benahpets dans le forum MFC
    Réponses: 8
    Dernier message: 19/05/2005, 00h19
  3. [Execution] Démarrer un programme d'un cdrom
    Par zzman dans le forum Général Java
    Réponses: 4
    Dernier message: 29/11/2004, 16h50
  4. [Debutant(e)]Execution d'un programme externe
    Par saidi_chahrat dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 26/08/2004, 11h35
  5. Xterm se fermant après l'éxécution d'un programme ?
    Par Clemaster dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 29/03/2004, 15h49

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