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 :

Thread fait dodo, Pas vouloir se repeindre


Sujet :

Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Thread fait dodo, Pas vouloir se repeindre
    Bonjour, je suis nouveau sur le forum Java :o
    j'espère ne pas m'être trompé de sujet

    voilà mon problème : pour un jeu je dois repeindre un écrans régulièrement (ce n'est pas un jeux en temps réel mais il dois se repeindre genre toutes les 0.5 secondes)

    j'utilise dans une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    do{
            [Calcul]
     
                  Arepeindre.repaint();
     
                  try{
                      Thread.sleep(100);
                    }catch(Exception e){}
    }while(...);
    le hic c'est qu'il me fait bien glander le temps (n fois les 100 milli secondes)
    mais durant toute cette période, il ne repeint pas le JPAnel
    (il n'appel pas la méthode paintcomponent(Graphics g) (j'ai mins un Systeme.out.println dedans)

    voilà
    je commence a déprimé parce que quand je copie colle un exemple du site :p ça marche -_-' et il fonctionne selon le même genre de principe :'(
    quelqu'un a déjà eu le problème et sait d'où il pourrait venir ?

    Merci d'avance

    PS: la methode repaint() fonctionne .... mais quand la boucle est finie ... il repeint tous et on vois le résultat final mais ce qui m'interesse c'est de voir pas à pas
    PPS : si je remplace le bloc try Catch par un JOptionPanel qui bloque le programme jusqu'a ce que j'appuie sur OK tout marche à merveilles
    sauf que je dois cliquer plus de 200 fois sur ok d'affiler pour voir étape par étape :p




    Merci =)

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    On oublie -_-' je ne sais pas me servir de l'option recherche -_-' je m'excuse
    je vais commencer par chercher


    je crois qu'on peut le dire ....
    je suis un boulet :p
    mais si quelqu'un a une réponse précise elle est la bienvenue :p
    mais des problèmes similaire sont déjà demandé :p

    edit : je transforme ma question : y'a t'il moyen de demander de repeindre dans un nouveau thread ?
    j'ai essayer de faire une classe qui étend thread
    avec la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    run(){
    Arepeindre.repaint();
    }

    mais même comme ça il bloque tout quand je sleep

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Je dirais qu'il faudrait plus de code que ça pour voir d'où vient le problème...

    Par contre, je crois que ton design pourrait être amélioré. En effet, tu sembles effectuer ton Thread.sleep(); au même niveau (et dans le même thread) que la méthode repaint(); or, il est totalement déconseillé de repeindre son composant dans un thread autre que l'EDT, et d'utiliser des bouffeurs de temps dans l'EDT.

    Il faudrait avoir une architecture comme ceci pour être plus efficace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    do {
        [Calcul]
        SwingUtilities.invokeLater(new Runnable () {
    // Ou pour être synchrone :
    //  SwingUtilities.invokeAndWait(new Runnable() {
            public void run () {
                Arepeindre.repaint();
            }
        });
        try {
            Thread.sleep(100);
        } catch (Exception e) {
        }
    } while (...);
    Peut-être que ceci résoudra déjà ton problème ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Ok je vais essayer merci

    edit : Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread

    je lis le tuto :p ^_°

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Oui, ce code doit être appelé depuis un autre thread que l'EDT ! Il faut donc wrapper ton do {...} while (...); dans un autre thread.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    JE VAIS VOUS DIRE 2 TRUC
    1 ça Marche
    2
    VOUS ÊTES DES GéNIES
    JE VOUS AIMES XD
    J'ai perdu ma journée mais maintenant ça marche
    je vous adore :d
    vraiment la ^^
    whouhouuuuuu


    un grand merci
    j'ai créé un nouveau thread dans lequel je fais mes calculs et je demande de repeindre
    si j'ai bien compris swing repeint toujours dans le thread principal
    enfin ça marche c'est le principale
    je relirai la théorie demain matin :p la je sature
    un grand merci :d

    edit: merci dingoth je viens de voir ton post :p mais ça va j'ai +- compris le tuto :p :d un grand merci :d

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/04/2007, 20h04
  2. Thread utile ou pas?
    Par mIch°° dans le forum Delphi
    Réponses: 7
    Dernier message: 12/01/2007, 13h57
  3. [Thread] Fais dodo cola mon ptit thread...
    Par foxdie dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 10/05/2006, 16h58
  4. [thread] synchronize ou pas ?
    Par dvarrel dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2004, 19h09

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