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

Concurrence et multi-thread Java Discussion :

[Thread]sleep()


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 54
    Points : 17
    Points
    17
    Par défaut [résolu] [Thread]sleep()
    bonjour,

    j' ai un petit probleme en voulant utiliser le "tread.sleep()" .

    pour la réalisation d' un jeu de la vie, j' utilise une grille de panel dont la couleur de chaque panel varie a chaque étape du timer.

    je fais donc une sorte de boucle infinie et a chaque étape je fais apel a une méthode de dessin. Mais le probleme c 'est qu' il ne se passe rien alors que ca marche si j' enleve le timer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while (timer == true) {
     
                    calcul();
              	dessin();
     
                    try {Thread.sleep(500);
        	} catch(InterruptedException f) {}
     
     
     
        }

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Tu as peut etre une exception.
    Rajoute dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while (timer == true) { 
     
      calcul(); 
      dessin(); 
     
      try {
        Thread.sleep(500); 
      } catch(InterruptedException f)  {
        e.printStackTrace();
      } 
    }
    Tu saura au moins si tu as un probleme avec ta fonction sleep.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 54
    Points : 17
    Points
    17
    Par défaut
    non ce n' est pas une exeption pcq lorsque je met un "System.out.println"
    a la place de la méthode dessin , ca marche.

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Je ne vois pas trop.
    Faudrait que tu soit plus precis sur tes methodes calcul et dessin.
    Et quand tu dis que cela fonctionne sans le timer, tu veux dire sans la methode sleep() ?

    --
    Bicnic.

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 54
    Points : 17
    Points
    17
    Par défaut
    donc j' ai un bouton qui sert a enclencher le "sleep()".

    si je met comme code pour ce bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    calcul();
    dessin();
    le programme marche alors tres bien mais il faut que je clic sur le bouton de maniere répétée afin d' imiter ce qu' aurai fait le sleep() .

    lorsque je veux mettre ce bout de code avec le sleep() , le programme boucle indéfiniment et il ne se passe rien. Alors que le sleep() marche si je remplace la méthode dessin par un "System.out.println".

    la méthode dessin se charge de changer la couleur de fond de chaque panel de la grille de panel.

  6. #6
    duj
    duj est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2003
    Messages : 141
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par Bicnic
    Je ne vois pas trop.
    Faudrait que tu soit plus precis sur tes methodes calcul et dessin.
    Et quand tu dis que cela fonctionne sans le timer, tu veux dire sans la methode sleep() ?

    --
    Bicnic.
    Idem, on est pas des devin : du code, du code !!!!!!

    (Mias je peux déjà te dire qu'il doit y avoir un problème dans une de tes methodes )
    Parfois, Google fait des miracles

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Pour information, il est plus que déconseillé de mettre le Thread de Swing en sleep !!!!
    Surtout que ton sleep passeras avant ton affichage et non après !
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 54
    Points : 17
    Points
    17
    Par défaut
    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
     
    private void dessin() {
        	int i=0;
        	while (i<abs)
    	     {
      	     	 int j=0;
      	     	   while (j<ord-1)
      	     	    {  
      	     	       if (tab1[i][j] == true) {
      	     	       	t[i][j].setBackground(Color.blue);
      	     	       }
      	     	       else {
      	     	       	t[i][j].setBackground(Color.white);
      	     	       }
      	     	       j++;
      	     	    }
      	     	  i++;
     
      	     }
        }
    où tab1 est un tableau a 2 dimension de boolean réactualisé par la méthode calcul. Et t[] [] est un tableau a 2 dimension de Jpanel dont on change la couleur.

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    eu peu donner le code complet de ta classe s'il n'est pas trop important ?
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Bon, voici un exemple de code qui fait une mise a jour massive de composants swing en boucle.

    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
    65
    66
    67
    68
    69
    70
    71
    72
    package org.alwin;
     
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Random;
     
    import javax.swing.*;
     
    public class TestSwing extends JFrame{
        private static final int ARRAY_SIZE = 20;
     
        JButton[][] p = new JButton[ARRAY_SIZE][ARRAY_SIZE];
        boolean[][] b = new boolean[ARRAY_SIZE][ARRAY_SIZE];
        Random rand = new Random();
     
     
        public TestSwing() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container contentPane = getContentPane();
            GridLayout layout = new GridLayout(ARRAY_SIZE,ARRAY_SIZE);
            contentPane.setLayout(layout);
            for( int i = 0; i < ARRAY_SIZE; i++ ) {
                for(int j = 0; j < ARRAY_SIZE; j++ ) {
                    p[i][j] = new JButton();
                    contentPane.add(p[i][j]);
                    b[i][j]=rand.nextBoolean();
                }
            }
            JButton pane = p[0][0]; 
            pane.setText("Clic me");
            pane.setBackground(Color.blue);
            pane.addActionListener(
                    new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            startAnim2();
                        }
                    }
                    );
            setSize(400,400);
            setVisible(true);
     
        }
        private void startAnim2() {
            Runnable r = new Runnable() {
              public void run() {
                  startAnim();
              }
            };
            new Thread(r).start();
        }
     
        private void startAnim() {
            for( int timer = 0; timer < 100 ; timer++) {
                for( int i = 0; i < ARRAY_SIZE; i++ ) {
                    for(int j = 0; j < ARRAY_SIZE; j++ ) {
                        JButton _p = p[i][j];
                        boolean _b = b[i][j];
                        _p.setBackground( _b ? Color.BLACK : Color.WHITE);
                        b[i][j] = rand.nextBoolean();
     
                    }
                }
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {}
            }
        }
     
        public static void main(String[] args) {
            new TestSwing();
        }
    }
    Maintenant, la situation dans laquelle tu te trouve toi, c'est lorsque tu utilise directement la méthode startAnim() dans ton appel ( ici, le listener du bouton en haut a gauche ).
    Tout le traitement se faisant dans le thread de swing, tu auras une mise a jour seulement à la fin de la boucle !

    Maintenant regarde la méthode startAnim2(). Elle utilise un Thread a part comme tu peu le constater et appelle startAnim().
    Aucune modification du code donc ! et une mise à jour toutes les 50 ms...
    Tu peu même fermer la fenêtre et la déplacer sans que celà ne perturbe l'affichage.

    Voilà, j'espère que celà te permettras de résoudre ton problème.
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 54
    Points : 17
    Points
    17
    Par défaut
    merci beaucoup pour ton aide. je vais essayer cela .

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 54
    Points : 17
    Points
    17
    Par défaut
    ca marche tres bien, encore merci !

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    A tu compris la raison de ton disfonctionnement :
    C'est surtout celà qui m'intéresse

    ( pense au tag résolu )
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 54
    Points : 17
    Points
    17
    Par défaut
    oui je pense avoir bien compris.
    il faut séparer le thread des méthode d' animation.
    j' ai essayé avec une boucle finie pour le sleep() et en efet une fois la boucle finie, l' afichage apparait.

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    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
     
    +-------+
    | event |
    +-------+
    | event |
    +-------+
    | event |
    +-------+
    | event |
    +-------+
         | peek()
         v
    +-------------+                           +---------------+
    | Dispatcher  | -> Dispatch and Wait ! -> | ton évènement |
    +-------------+                           +---------------+
    Voici un petit schéma simple.
    Tous les évènements swing sont empilés dans l'EventQueue
    Un Thread ( Dispatcher ) sort les évènements 1 par 1, l'execute et attend la fin de l'évènement avant de sortir le suivant !

    Dans ton cas, tu ajoute d'autres évènements dans la pile en faisant des setBackGround().
    Donc, ils s'empiles et doivent attendre la fin de "ton évènement" avant d'être traités par le Dispatcher.

    Si ton évènement est infini, tu ne verras jamais le résultat.

    Quand a ton test sur un simple clic de souris, et bien il marche et c'est normal car ton code ne fais qu'un calcul et qu'un affichage, ensuite, tu rend la main au dispatcher qui affiche le résultat.
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 54
    Points : 17
    Points
    17
    Par défaut
    merci, c' est plus simple a comprendre vu comme ca.

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

Discussions similaires

  1. boost::thread, sleep et changement d'heure
    Par lebaste77 dans le forum Boost
    Réponses: 8
    Dernier message: 11/02/2008, 16h59
  2. JButton avec boucle while contenant thread.sleep(1000)
    Par v4np13 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/10/2007, 20h31
  3. Timers, boucles d'affichage et Thread.sleep
    Par Silk_do_Nadear dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 28/07/2007, 01h49
  4. [Prbl] Thread(image ne s'affichant pas avant le thread.sleep
    Par stephane92400 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 26/06/2006, 11h57
  5. [Thread] PB Thread.sleep(1000) marche pas
    Par kliel dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 03/12/2004, 13h47

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