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

 Java Discussion :

Thread & wait()


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut Thread & wait()
    Bonsoir,

    Dans le cadre d'un projet, j'ai décidé de coder un Bomberman. Le jeu est déjà crée mais maintenant je code les petits "plus".

    Voilà, je me sens pas encore à l'aise avec les méthodes wait() & notifyAll().
    Ce que j'aimerais codé c'est un petit décompte qui lance une partie après 3 secondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void startGame(){
    		ActionListener reduceTime = new ActionListener() {
    			public void actionPerformed(ActionEvent e){
    				if(decountTime == 0){
    					System.out.println("GAME START !!!!!!");
    					Model.setGameState(1);
    					timer.stop();
    				}
    				else{System.out.println("Decount Time : "+decountTime);decountTime--;}
     
    		}};
    		timer = new Timer(1000, reduceTime);
    		timer.start();
    	}
    Normalement ce Timer va mettre l'état du jeu à 1 (En marche) après 3 secondes.
    Mais avant que cette méthode soit lancée, le jeu était à l'état 0 (En pause) mise par défaut.
    //Et -1 pour l'état (Fin)


    Ce qui pose problème c'est que je n'arrive pas à arrêter la petite horloge (un objet CountDown). Peut-être ais-je mal codé la chose. Lorsque j'exécute mon programme j'obtiens donc :
    Decount Time : 3 (Venant de StartGame)
    On attend tjrs (Venant de la méthode attente)
    et le jeu se bloque. (Oui, c'est peu-être à cause du wait() mais le Timer de StartGame ne devrait t'il pas continué sa tâche ?)


    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
    59
    60
    61
    62
    63
    64
    public class CountDown extends JPanel implements Runnable{
     
    	private GregorianCalendar time;
    	private Timer timer;
    	private final GregorianCalendar FINISH = new GregorianCalendar(0, 0, 0, 0, 0, 0);
    	private final GregorianCalendar BEGIN_DELUGE = new GregorianCalendar(0, 0, 0, 0, 2, 0);
    	private int timeOfCountDown;
    	private static Font f = new Font("Book Antiqua", Font.BOLD, 25);
    	private int minutes;
    	private int secondes;
     
    	private boolean delugeTime = true;
     
    	public CountDown(int minutes, int secondes){
    		this.minutes = minutes;
    		this.secondes = secondes;
    		time = new GregorianCalendar(0, 0, 0, 0, minutes, secondes);
     
    		new Thread (this).run();
    	}
     
    	public void test(){
    		ActionListener reduceTime = new ActionListener() {
    			public void actionPerformed(ActionEvent e){
    				if( Model.isGameState() == 0 ){
    					attente();
    				}
    				else if ( Model.isGameState() == -1 | time.equals(FINISH)){timer.stop();}
    				else {time.add(Calendar.SECOND,-1);}
    			}
    		};
    		setTimeOfCountDown(transformCalendarToInt(new GregorianCalendar(0, 0, 0, 0, minutes, secondes)));
    		this.setOpaque(false);
    		this.setPreferredSize(new Dimension(72, 72)); 
     
    		timer = new Timer(1000, reduceTime);
    		timer.start();
    	}
     
    	public void attente(){
    			synchronized(this){
    				if(Model.isGameState() == 0){
    					System.out.println("On attend tjrs");
    					try {
    						this.wait();
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    	}
     
    	public void reprise(){
    		synchronized(this){
    			if(Model.isGameState() == 1){
    				System.out.println("Reprise du thread");
    				this.notifyAll();
    			}
    		}
    	}
     
    	public void run() {
    		test();
    	}
    Si vous pouvez m'éclaircir, çà m'aiderait grandement car je vai devoir l'utilisé pour d'autres threads.

    Merci

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    attente() est indirectement appelée par le timer, timer qui lui meme est déclencher par le thread de l'EDT. Avec ce code, tu va mettre ce thread en "pause", grave erreur. Ton interface ne réagira plus (c'est lui qui s'occupe de l'affichage) et le timer chargé de notifier ne se déclenchera jamais (puis que le thread EDT n'ira pas e chercher car il est en pause).

    Tu n'a qu'un seul thread qui fait à la fois le wait et le notify, ca ne peux pas marcher.

    Accessoirement, mais c'est pas lié à ton problème ici, on ne lance pas un thread avec run mais avec start

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut
    Merci pour votre réponse.

    Oui, juste c'est bien avec start() et non run() qu'on démarre un thread.

    Tu fais bien de me le dire que je mettais le thread de l'EDT en pause =) Je n'aurais pas beaucoup avancé.

    Donc si je comprend bien, ce thread étant en pause ne pourra jamais se réveiller de cette façon car c'est le même thread.

    Mais alors que peux-tu me suggérer pour régler cela si je ne peux pas stopper ce thread là et mettre la méthode notify() dans un autre Thread (Comme dit dans l'API) ?

    De plus, la pause sur le thread de l'EDT est-il la cause blocage du Timer de startGame() ? J'image surement puisque le programme "reste en attente" là dessus.


    Merci et bonne nuit =)

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le Thread de l'EDT c'est lui qui gère ton affichage et toute la couche des event swing. Tu le met en pause, plus rien ne s'effectue de ce coté là.


    Je ne vois pas quel est ton besoin de jouer avec des wait/notify Au lieu de faire un notify, il est plus simple, dans ton cas, d'appeler la méthode qui fait démarrer le jeux quand le timer est à 0 est c'est tout.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut
    Par exemple je pourrai ré-utiliser ceci si l'utilisateur souhaite mettre le jeu en pause, en mettant un wait() sur les threads du countDown, animations, mouvements et IA et ensuite faire un notify() quand le joueur souhaite continuer la partie.

    De plus, c'est aussi pour moi pour que je puisse me familiariser avec le concept.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour mettre en pause, il faut déjà commencer par avoir un thread à mettre en pause. Ca sous entends par exemple, qu'il existe un Thread d'animation, ce n'est pas le cas actuellement. Une fois cela fait, il suffira de faire des wait / notify, tout simplement.

Discussions similaires

  1. [THREAD]wait() sur un processus autre que celui courant
    Par GesMo dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 20/03/2008, 11h50
  2. [Threading] ca bloque sur un wait
    Par vahid dans le forum Java ME
    Réponses: 3
    Dernier message: 08/08/2007, 12h02
  3. [Wait / Sleep Thread] ho multhitread adoré..
    Par zolive dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 15/11/2006, 12h50
  4. [Thread] Petite question sur notify() et wait()
    Par Invité dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 12/05/2006, 12h13
  5. [débutant][Thread] wait et NotifyAll
    Par norkius dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 14/03/2005, 15h28

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