[JAVA] wait & notifyAll

Résolu/Fermé
Ineur - 19 févr. 2011 à 15:57
 Ineur - 20 févr. 2011 à 17:38
Bonjour,


Dans mon projet, je fais descendre des blocs d'une case toutes les secondes. De plus, quand l'utilisateur appuiera sur la touche Flèche_Bas, les blocs descendront dix fois plus vite.
J'ai d'abord pensé à utiliser Thread.sleep(delai) directement dans mon Jpanel. Cependant, lorsque ma classe était endormie, il m'était impossible de la réveiller. Donc même si l'utilisateur appuyait sur la touche, il devait attendre la fin du sleep().


J'ai ensuite pensé à utiliser des Threads.
Je me suis alors un peu renseigné sur ceux-ci ainsi que sur les méthodes wait() et notifyAll() de la classe Object.

wait() permet de mettre le Thread en pause en attendant l'appel aux fonctions notify() ou notifyAll(), tandis que ces deux dernières réveillent les Threads en pause.

J'ai donc créé une classe héritant de Thread que j'instancie et que je lance dans mon JPanel.
Mais le résultat n'est toujours pas celui que je veux.
On dirait qu'au lieu de se mettre en pause, le Thread met en pause le JPanel.


Voici le code de ma classe Thread:

public class Descente extends Thread {
	private Terrain terrain;
	private int delai;
	private boolean pause=false;
	
	public Descente(Terrain nvTer, int nvDelai){
		this.terrain=nvTer;
		this.delai=nvDelai;
	}
	
	public synchronized void pause(){
		if(!pause){
			this.pause=true;
			try {
				System.out.println("Je m'endors :"+delai);
				System.out.println(this);
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public synchronized void reveil(){
		System.out.println("Je réveille les autres :"+delai);
		this.notifyAll();
	}
	
	public void run() {
		while(true){
			try {
				System.out.println("J'attends "+delai+" ms || pause :"+pause+" || etat :"+this.getState());
				Thread.sleep(delai);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			terrain.descendre();
		}
	}

	public String toString(){
		return "Descente : vitesse="+delai;
	}
}



Voici le code de mon Jpanel

public class PanneauTetris extends JPanel implements KeyListener {

// Code ...

public void keyPressed(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_DOWN){
			System.out.println("Touche appuyée : "+e.getKeyCode());
			//desNorm.reveil();
			desNorm.pause();
			//if(desRap.getState() == Thread.State.NEW)
				//desRap.start();
		}
	}

	public void keyReleased(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_DOWN){
			//desRap.reveil();
			//desRap.pause();
		}
	}




C'est la première fois que je suis autant bloqué en programmation. J'ai cherché longuement ce matin mais aucun topic ne semble être apparenté à mon problème.


Je vous remercie d'avance pour l'aide que vous pourrez m'apporter.
A voir également:

1 réponse

Personne ?
0