Deux threads faisant défiler des jpanels font ramer ma machine

o00gourou00o Messages postés 7 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 15 décembre 2010 - 3 août 2010 à 13:01
o00gourou00o Messages postés 7 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 15 décembre 2010 - 3 août 2010 à 15:40
Bonjour !!

Je vais vous faire un petit topo si vous le voulez bien...

Le but est d'avoir dans une fenêtre deux parties dans lesquelles défilent des pages xhtml présentes sur le disque dur (affichées grâce à ["https://xhtmlrenderer.dev.java.net/" Fying Saucer]).
Un peu comme deux diaporamas de pages web qui défilent indépendamment dans la même fenêtre (verticalement pour l'un, horizontalement pour l'autre, à des vitesses différentes, etc...).

J'ai donc fait ma frame, tout bien, avec deux panneaux dedans, chacun à sa place, et je charge toutes les pages à faire défiler dans un tableau de JPanel (le XHTMLPanel de Flying Saucer pour être exact mais il hérite de JPanel), et j'ajoute chaque JPanel au Container du "panneau principal". J'ai associé un thread à chaque partie de la fenêtre pour gérer le défilement. Ces threads appellent la fonction setBounds des deux panneaux qui défilent (celui qui s'en va de l'écran et celui qui arrive dessus) pour les décaler de tant de pixels (5) toutes les tant de millisecondes (5 aussi) et qui fait une pause de tant de millisecondes pour afficher la page.

Et quand les panneaux du haut et ceux du bas défilent en même temps, ça rame sec !!
Je n'ai pourtant pas l'impression d'en demander tant que ça à la machine...

Sauriez-vous d'où le problème peut venir ? Et éventuellement comment le résoudre ?

Je vous mets le bout de code du thread correspondant au défilement vertical:

        @Override
        public void run() {
            while (running) {
                        // Défilement vertical
                        if (MenuPanel.scrollType 'V' || MenuPanel.scrollType 'v') {
                            if (this.i >= this.panel.menuPages.size()) {
                                this.i = 0;
                            }
                            if (this.j >= this.panel.menuPages.size()) {
                                this.j = 0;
                            }

                            this.panel.tab[i].setBounds(0, 0, this.panel.getWidth(), this.panel.getHeight());
                            this.panel.tab[j].setBounds(0, this.panel.getHeight(), this.panel.getWidth(), this.panel.getHeight());

                            try {
                                Thread.sleep(MenuPanel.pauseDuration);
                            } catch (InterruptedException e) {
                                JOptionPane.showMessageDialog(null, "Erreur lors de l'affichage de la carte." + System.getProperty("line.separator") + "(" + e + ")", "Oyez, oyez !!", JOptionPane.ERROR_MESSAGE);
                            }

                            while (this.panel.tab[i].getY() > -this.panel.getHeight()) {
                                try {
                                    Thread.sleep(MenuPanel.scrollSpeed);
                                } catch (InterruptedException e) {
                                    JOptionPane.showMessageDialog(null, "Erreur lors du défilement de la carte. " + System.getProperty("line.separator") + "(" + e + ")", "Oyez, oyez !!", JOptionPane.ERROR_MESSAGE);
                                }
                                this.panel.tab[i].setBounds(0, this.panel.tab[i].getY() - 5, this.panel.getWidth(), this.panel.getHeight());
                                this.panel.tab[j].setBounds(0, this.panel.tab[j].getY() - 5, this.panel.getWidth(), this.panel.getHeight());
                            }
                            this.i++;
                            this.j++;
                        }


menuPages est donc un Vector des chemins d'accès aux pages html;
tab est le XHTMLPanel[] contenant les pages
panel est le JPanel principal, la partie de la fenêtre sur laquelle on va afficher le défilement
scrollType, scrollSpeed et pauseDuration sont initialisés à 'V', 5 et 5000


Quand deux threads comme celui-ci sont lancés (il y a deux ensembles de pages à faire défiler en même temps dans la même fenêtre je le rappelle), ça fait ramer ma bécane (avec un atom 1,6GHz à deux coeurs)!! Et même, un seul thread comme celui-ci s'affiche limite sans ramer sur mon netbook et son atom 1,6GHz.

Si quelqu'un peut m'aiguilller, ça m'arrangerait bien...

7 réponses

o00gourou00o Messages postés 7 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 15 décembre 2010
3 août 2010 à 13:03
Oups pardon pour le code.
Vu qu'apparemment on ne peut éditer son message, je vous le mets ici :

        @Override
        public void run() {
            while (running) {
                        // Défilement vertical
                        if (MenuPanel.scrollType 'V' || MenuPanel.scrollType 'v') {
                            if (this.i >= this.panel.menuPages.size()) {
                                this.i = 0;
                            }
                            if (this.j >= this.panel.menuPages.size()) {
                                this.j = 0;
                            }

                            this.panel.tab[i].setBounds(0, 0, this.panel.getWidth(), this.panel.getHeight());
                            this.panel.tab[j].setBounds(0, this.panel.getHeight(), this.panel.getWidth(), this.panel.getHeight());

                            try {
                                Thread.sleep(MenuPanel.pauseDuration);
                            } catch (InterruptedException e) {
                                JOptionPane.showMessageDialog(null, "Erreur lors de l'affichage de la carte." + System.getProperty("line.separator") + "(" + e + ")", "Oyez, oyez !!", JOptionPane.ERROR_MESSAGE);
                            }

                            while (this.panel.tab[i].getY() > -this.panel.getHeight()) {
                                try {
                                    Thread.sleep(MenuPanel.scrollSpeed);
                                } catch (InterruptedException e) {
                                    JOptionPane.showMessageDialog(null, "Erreur lors du défilement de la carte. " + System.getProperty("line.separator") + "(" + e + ")", "Oyez, oyez !!", JOptionPane.ERROR_MESSAGE);
                                }
                                this.panel.tab[i].setBounds(0, this.panel.tab[i].getY() - 5, this.panel.getWidth(), this.panel.getHeight());
                                this.panel.tab[j].setBounds(0, this.panel.tab[j].getY() - 5, this.panel.getWidth(), this.panel.getHeight());
                            }
                            this.i++;
                            this.j++;
                        }
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
3 août 2010 à 13:24
Salut,

Tu as essayé d'augmenter le temps d'attente ? Quel intérêt de synchroniser toutes les 5 ms ? Ca fait plus de 200 fois par seconde ! Ce qui fait 200 fois le recalcul de la dimension et le positionnement de tes panels.

Il suffit que les panel que tu utilises recalcule la page à afficher à chaque nouvelle dimension, et c'est tout à fait normal que ca rame.

Essaye avec un timer de 50 ms, ce sera déjà bien plus raisonnable et je ne pense pas que tu y vois vraiment une différence à l'oeil nu.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
o00gourou00o Messages postés 7 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 15 décembre 2010
3 août 2010 à 13:57
Merci de ta réponse.
Effectivement, avec un timer de 50ms, ça ne rame plus. Par contre, ça rend le défilement très lent. En effet, si je décale mon panneau de 5px toutes les 50ms (soit 1px/10ms), le défilement prendra 1280px*10ms = 12.8 secondes pour parcourir mon écran. Il faudrait qu'il se fasse en 1 seconde ou deux, maximum. Si je décale le panneau de 10px ou plus toutes les 50ms, ce n'est plus fluide, on voit que le panneau fait des sauts de 10px.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
3 août 2010 à 14:02
Salut,

C'est à toi d'ajuster en jouant sur les deux paramètres : nombre de pixels à faire défiler à chaque tour de boucle, et temps d'attente entre 2 défilements.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
o00gourou00o Messages postés 7 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 15 décembre 2010
3 août 2010 à 14:34
Damned !!

Peut-être y'a-t-il un moyen pour le XHTMLPanel d'éviter de recalculer toute la page à afficher à chaque fois que je la décale ?
Parce que d'après ce que je comprends, c'est surtout ça la racine du problème. Les pages en elles-mêmes sont fixes, pas d'animation, rien... Donc si c'était possible de charger les pages une bonne fois pour toutes et de simplement décaler ce qui a été chargé au début, sans tout recalculer, ce serait nickel.
Après, j'imagine que la question a plus sa place sur un forum de Flying Saucer, mais le XHTMLPanel est un peu une sorte de JEditorPane donc si quelqu'un a une idée je suis preneur...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
3 août 2010 à 15:01
Salut,

En effet, je pense que les développeurs de la bibliothèque que tu utilises seront certainement les mieux placés pour répondre à des problèmes de performance.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
o00gourou00o Messages postés 7 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 15 décembre 2010
3 août 2010 à 15:40
Ouaip, je vais y faire un tour.
En tout cas merci pour ta réactivité et tes réponses.
0
Rejoignez-nous