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 :

Problême utilisation du Thread.sleep.


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut Problême utilisation du Thread.sleep.
    Bonjour à tous!

    J'ai un soucis que je ne parviens pas à régler dans l'un de mes projets.

    Je m'explique.
    Celui-ci est constitué de 2 JPanel, au sein d'un JFrame.
    L'un des 2 JPanel contient deux bouton, qui me permettent d'incrémenter/décrémenter un int que j'appelerai "y".
    L'autre JPanel contient une image, beaucoup plus large que la fenêtre, que je veux faire défiler. Le défilement "accélère" avec l'accroisement de "y".
    La fonction qui fait la fait défiler, est dans ce JPanel, la voici :
    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
     
    	public void defilement(int i){
    		if(this.y!=0){
    			this.x=0;
    			while(true){						
    //Sert a remettre le "paysage" au début avant la fin du défilement de celui-ci pour ne pas //voir que le fond...  
    				if(x==-4630){	
    					x=0;
    				}
    				x--;
     
    				this.repaint();
    				try {
    					Thread.sleep(this.y);	// plus "y" croit, plus on raffraichit vite l'image
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
                                    if(y==0){
    				break;
                                    }
    			}
    		}
    	}
    RQE : la coordonne x, est l'implantation en absice de mon image à faire défiler.

    Mon problème :
    Lorsque je lance mon programme, celui semble "bloqué"...
    Je pense que c'est à case des "sleep" qui le mettent tout entier en sommeil, et que donc il "n'écoute" plus mes boutons... Mais je vous avoue que là ça dépasse mon niveau dans l'immédiat.


    J'espère que vous trouverez le moyen de m'expliquer ce qui merdouille et comment corriger.

    Merci en tout cas!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 129
    Points : 86
    Points
    86
    Par défaut
    un while(true) sur le thread principal est assez bloquant...

    J'ai pas compris l’intérêt du sleep ?
    Regarde du coté de la classe : SwingUtilities pour la gestion des threads sous Swing

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    Lorsque je lance mon programme, celui semble "bloqué"...
    Je pense que c'est à case des "sleep" qui le mettent tout entier en sommeil, et que donc il "n'écoute" plus mes boutons...
    Toute la boucle while qui ne se termine jamais, en fait.

    L'interface graphique est gérée par un seul thread, qu'on appelle l'Event Dispatch Thread, ou EDT.
    Si ce thread reste coincé dans une boucle while, ou qu'il dort dans un sleep, ou qu'il reste coincé de toute autre manière, alors l'interface graphique est entièrement gelée.


    Quand on veut faire des traitements lourds et longs, il faut les faire dans des threads à part, pour éviter de geler l'interface graphique.

    Et quand on veut faire des affichages progressifs en fonction du temps, il ne faut pas attendre dans le thread que ce soit le bon moment. Il faut générer un évènement à l'aide d'un thread, et traiter cet évènement qui dit qu'il faut changer l'affichage.
    Bref, tu dois remplacer ce while et ces sleep() par un Timer qui génère un évènement chaque fois que tu dois redessiner.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Merci de votre aide.
    J'ai tenté de placer ma fonction dans une classe, qui extends Thread, et j'ai le même problême...
    Je vais réessayer avec un Timer, mais j'avais eu le même effet hier, je comprends pas bien...
    Je vous tiens au courant!
    Merci beaucoup!

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Je viens d'essayer avec un timer, ça "plante" toujours, ça doit venir d'une erreur de ma part, mais je cherche encore...

    Donc, il ne s'agit en fait pas de boutons, renvoyant la valeur de y, mais d'un "levier" à monter/descendre, pour augmenter/diminuer "y".
    C'est donc un évènement "mouseDragged" sur la zone concernée qui me permet de déclencher ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void mouseDragged(MouseEvent e) {
    	pantop.defile(panrig.gettY());
     
    }
    pantop étant de le nom de l'instance PanTop, classe définissant mon JPanel où doit défiler l'image.
    Dans cette classe j'ai donc :

    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
     
    private Timer time = new Timer(0, this);
     
    //...
    	public void defile(int y){
    		if(y==0){             //Si on descends le levier au min, on stop
    			time.stop();
    		}else{
    			time.setDelay(150-y);
    			while(true){  //La boucle sert a maintenir le defilement
    				if(!time.isRunning()){
    					time.start();
    				}
    			}
    		}
    	}
     
    //Et donc dessous, juste pour faire un test
    //ne fais rien défiler, mais devrais écrire du texte...
     
    	public void actionPerformed(ActionEvent arg0) {
    		System.out.println("ca tourne");
     
    	}
    Et quand je lance, j'ai ma fenêtre...
    Mais tout freeze...

    Je ne comprends plus grand chose, ai besoin de tout votre savoir

    Merci en tout cas.

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Donne un code reproduisant le problème et qui compile.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2009, 08h33
  2. Problème avec repaint() et Thread.sleep
    Par fab13 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 12/08/2008, 23h02
  3. Problème d'utilisation des threads dans mes servlets
    Par casho dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 08/08/2007, 19h34
  4. Problème avec l'utilisation de thread
    Par djayone dans le forum VB.NET
    Réponses: 3
    Dernier message: 06/06/2007, 19h31
  5. [WD9] Problème avec l'utilisation des threads
    Par ramaro dans le forum WinDev
    Réponses: 2
    Dernier message: 29/01/2007, 11h51

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