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 de thread - n'agit pas pendant la boucle mais à la fin


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Par défaut Problème de thread - n'agit pas pendant la boucle mais à la fin
    Bonjour à tous. Je suis en train de créer une application du style de Motus en Java, et j'ai un souci avec les threads.

    Ma grille de mots est une matrice de [6][8] JTextField qui contiennent chacun une lettre.
    Lorsque j'écris un mot dans la grille et le valide, j'utilise la boucle suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for(int i = 0 ; i < 8 ; i++) // On affiche chaque lettre
    		{
                            // On espace chaque affichage de lettre de 2 dixièmes de seconde
    			try { Thread.sleep(200); } catch (InterruptedException e) {}
     
    			if(lettre au bon endroit)
    			{
    				grille[motActuel.getListe().size()][i].setBackground(Color.RED);
                            }
    			else
    			{
    				grille[motActuel.getListe().size()][i].setBackground(Color.ORANGE);
    			}
    		}
    Le souci est le suivant : les 8 coupures de temps fonctionnent bien, mais les changements d'affichage ne sont effectifs qu'à la fin de la boucle. D'où cela peut-il venir ?

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    La on ne vois presque rien de ton code.

    Cependant je pense que ton problèmes vient du fait que tu ne crée pas de thread (pour l'animation si je puis dire). Et dans ce thread utiliser des SwingWorker.invokeLater au moment de manipuler les object graphique.

    D'ou tu as un "callage" de l'interface pendant le temps de ta boucle puis après tu vois seulement les changements.

    Tu pourrais faire par exemple quelque chose comme :

    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
    Thread animationLettre = new Thread()
    		{
    			public void run()
    			{
    				for(int i = 0 ; i < 8 ; i++) // On affiche chaque lettre
    				{
    		            // On espace chaque affichage de lettre de 2 dixièmes de seconde
    					try { Thread.sleep(200); } catch (InterruptedException e) {}
    		 			SwingUtilities.invokeLater(new Runnable()
    					{
    						public void run()
    						{
    							if(lettre au bon endroit)
    								grille[motActuel.getListe().size()][i].setBackground(Color.RED);
    							else
    				      			grille[motActuel.getListe().size()][i].setBackground(Color.ORANGE);
     
     
    						}
    					});
    				}
    			}
    		};
    		animationLettre.start();
    Ou regarder http://rom.developpez.com/java-swingworker/
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Par défaut
    Mais comment je peux accéder à mes données précédentes (grille, i etc) en utilisant une classe interne ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Tu fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Taclasseprincipale.this.tavariable
    (nom de la classe principale, this pour indiquer qu'il s'agit de l'instance de la dite classe, suivi de la variable voulue).

    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
    public class MaClasseMere
    {
    	String message = "";
    	public void fonction()
    	{
    		Thread t = new Thread()
    		{
    			public void run()
    			{
    				MaClasseMere.this.message="dudul";
    			}
    		};
    		t.start();
    	}
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Par défaut
    Il reste la variable i de la boucle qui évolue et donc ne peut être mise "final" ?

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Relis mon code, la variable I est dans le Thread pas en dehors de celui ci donc pas de problèmes (ou alors je ne te comprends pas)

    Edit : Ha oui ok tu parlais surement de celui qui est dans le swingworker.

    Une solution rapide et peut être pas adéquate. (tu auras sans doute le meme probleme avec grille)

    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
    Thread animationLettre = new Thread()
    		{
    			public void run()
    			{
    				for(int i = 0 ; i < 8 ; i++) // On affiche chaque lettre
    				{
     final int j = i;
    		            // On espace chaque affichage de lettre de 2 dixièmes de seconde
    					try { Thread.sleep(200); } catch (InterruptedException e) {}
    		 			SwingUtilities.invokeLater(new Runnable()
    					{
    						public void run()
    						{
    							if(lettre au bon endroit)
    								grille[motActuel.getListe().size()][j].setBackground(Color.RED);
    							else
    				      			grille[motActuel.getListe().size()][j].setBackground(Color.ORANGE);
     
     
    						}
    					});
    				}
    			}
    		};
    		animationLettre.start();
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. REquete sans erreur sql qui n'agit pas ........
    Par Skam dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/02/2005, 13h41
  2. ça rentre pas dans la boucle pendant l'exécution
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 9
    Dernier message: 15/01/2005, 15h41
  3. problème que je n'arrive pas à résoudre de façon récursive
    Par miam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/07/2004, 11h21
  4. [thread] synchronize ou pas ?
    Par dvarrel dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2004, 19h09
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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