Partage
  • Partager sur Facebook
  • Partager sur Twitter

Une while qui bug !

While qui ne tourne pas quand l'appli est un jar

    25 avril 2015 à 22:35:39

    Salut tout le monde :)

    J'ai un petit problème qui, me semble très étrange. Bref dans mon appli j'ai un Thread qui tourne en même temps que le main, et qui exécute ce code : 

    public void run() {
    		while((running)){
    			
    			if(pane.getSelectedComponent() == pan){
    				
    				up = new Updater(frm);
    				running = false;
    				
    			}
    		}
    	}

    Voilà tout marche sur Eclipse : je suis content, je l'exporte en .jar comme d'habitude tout marche sauf ce Thread qui ne tourne pas ! Je lance donc la console avec, mais il me retourne aucune erreur, juste rien ne se passe. Donc je rajoute un 

    system.out.println("test");

    ici 

    public void run() {
    		while((running)){
    			
    			System.out.println("test");
    			
    			if(pane.getSelectedComponent() == pan){
    				
    				up = new Updater(frm);
    				running = false;
    				
    			}
    		}
    	}

    Et la miracle, je le réexporte et ça marche. J'ai testé le syso avant la while : ça marche pas, c'est juste la while qui décone.

    Mais le plus bizarre c'est que quand je teste le .jar sur un autre ordi, sans le System.out.println("test'), ça fonctionne à merveille. Avec le même système d'exploitation : Windows 7 Edition Familiale Premium, la même version de java... 

    Merci !

    -
    Edité par Nain0nain 25 avril 2015 à 22:36:33

    • Partager sur Facebook
    • Partager sur Twitter

    Le java, c'est cool !

      26 avril 2015 à 0:17:08

      Bonsoir.

      Ce n'est pas parce que tu as un "test" qui s'affiche en boucle que cela signifie que cela fonctionne !
      Sans le System.out tu ne vois rien ... parce qu'il n'y a rien a afficher, et pourtant cela boucle quand même.

      Tu n'expliques pas ton problème, ce que tu dois obtenir : est-ce que cela boucle à l'infinie ? cela devrait-il s'arrêter selon un événement ? le test dans le if qui ne fonctionne pas (normal, car la comparaison d'objets se fait via .equals()) ?

      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        26 avril 2015 à 11:18:09

         Bonjour et merci pour votre réponse !

        J’ai une boucle infinie, tant que la condition n’est pas vérifié (pour les .equals() tu as raison j’avais oublié, pourtant les == marchent tout de même), c’est à dire que dans mon appli j’ai un JTabbedPane avec des onglets, et je veux savoir quand l’utilisateur est sur l’onglet qui contient le JPanel pan. Après, quand la condition a retourner vrai la boucle s'arrête.

        Sur Eclipse la condition s’exécute correctement (même avec les == ), or dans le .jar la condition s'exécute correctement que quand je rajoute le "test", mais sinon non.

        -
        Edité par Nain0nain 26 avril 2015 à 11:20:18

        • Partager sur Facebook
        • Partager sur Twitter

        Le java, c'est cool !

          26 avril 2015 à 11:39:50

          Je doute fortement qu'un System.out change le comportement d'une égalité.
          A mon avis le problème vient d'ailleurs.

          Le == et le equals() ont le comportement si et seulement si la méthode equals() n'est pas surchargée, car par défaut le test est this == obj.
          Dans Swing les composants n'ont pas surchargés equals(), donc utilisent la méthode native de la classe Object, et donc utilisent ==.
          Mais bon sauf cas hyper spécifique, la comparaison d'objets doit se faire avec equals().

          Utiliser une boucle infinie dans un Thread parallèle est une double mauvaise idée :

          • La boucle infinie utilise des ressources pour rien : thread à 100%.
            Ajouter un Thread.sleep() n'est pas la solution non plus, car imaginons que tu mettes une pause de 2sec, et que tu changes de composant 2 fois en moins d'1sec, tu risques de passer à côté.
          • La gestion des Thread est compliquée, et le risque de plantage est élevé : oublier de l'arrêter, arrêt au mauvais moment, concurrence, ...

          La solution la plus propre et simple et d'utiliser les événements.
          Exemple ici : http://www.java2s.com/Tutorial/Java/0240__Swing/ListeningforSelectedTabChanges.htm

          • Partager sur Facebook
          • Partager sur Twitter
          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
            1 mai 2015 à 18:19:48

            Ouais c'est une bonne solution, mais je comprends toujours pas comment un tel problème peut arriver ! 

            Merci, quand même.

            • Partager sur Facebook
            • Partager sur Twitter

            Le java, c'est cool !

            Une while qui bug !

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown