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

AWT/Swing Java Discussion :

Problème processeur GlassPane


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Problème processeur GlassPane
    Bonjour à tous,

    J'ai créé une classe GlassPane qui me permet de griser l'intégralité de la fenêtre pendant le traitement d'une tache de longue durée (ex :connexion base de données, ...).
    Cela me permet d’empêcher l'utilisateur de cliquer sur un élément de la fenêtre pendant le traitement de cette tache. Cette classe est du plus bel effet.

    Voici le code :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    public class DarkGlassPane extends JComponent implements MouseListener {
    	private static final long serialVersionUID = 1L;
     
    	private Thread animThread;
     
    	private int alphaLevel;
    	private int rampDelay;
    	private float shield;
     
        public DarkGlassPane() {
        	this.animThread = null;
     
        	this.alphaLevel = 0;
            this.rampDelay = 300;
            this.shield = 0.70f;
        }
     
        public void start() {
        	addMouseListener(this);
      	setVisible(true);
     
            animThread = new Thread(new Animator(true));
            animThread.start();
        }
     
        public void stop() {
        	if (animThread != null || animThread.isAlive()) {
        		animThread.interrupt();
        		animThread = null;
     
        		animThread = new Thread(new Animator(false));
            	animThread.start();
        	}
        }
     
        public void paintComponent(Graphics g) {
        	Graphics2D g2 = (Graphics2D) g;
     
        	g2.setColor(new Color(0, 0, 0, (int) (alphaLevel * shield)));
        	g2.fillRect(0, 0, getWidth(), getHeight());
        }
     
        private class Animator implements Runnable {
        	private boolean started;
     
        	protected Animator(boolean started) {
        		this.started = started;
            }
     
            public void run() {
            	long start = System.currentTimeMillis();
     
            	while (!Thread.interrupted()) {
            		repaint();
     
            		if (started) {
            			if (alphaLevel < 255) {
            				alphaLevel = (int) (255 * (System.currentTimeMillis() - start) / rampDelay);
            				if (alphaLevel >= 255) {
            					alphaLevel = 255;
            				}
            			}
            		} 
            		else {
            			if (alphaLevel > 0) {
            				alphaLevel = (int) (255 - (255 * (System.currentTimeMillis() - start) / rampDelay));
            				if (alphaLevel <= 0) {
            					alphaLevel = 0;
            					break;
            				}
            			}
            		}
     
            		Thread.yield();
            	}
     
     
            	if (!started) {
            		setVisible(false);
               		removeMouseListener(DarkGlassPane.this);
            	}
            }
        }
     
        public void mouseClicked(MouseEvent e) {
        }
     
        public void mousePressed(MouseEvent e) {
        }
     
        public void mouseReleased(MouseEvent e) {
        }
     
        public void mouseEntered(MouseEvent e) {
        }
     
        public void mouseExited(MouseEvent e) {
        }
    }
    Le soucis avec cette classe est que lorsque je l'utilise, mon processeur peut aller jusqu'à 70% d'utilisation!!!

    Voici le code pour l'utiliser
    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
     
    ...
    DarkGlassPane glassPane = new DarkGlassPane();
    frame.setGlassPane(glassPane);
    ...
    ...
    Thread t = new Thread(){
                            public void run() {
    	    			try {
    	    				glassPane.start();
    	    				Thread.sleep(10000); // traitement long 
    	    				glassPane.stop();
    	    			} catch (InterruptedException e) {
    	    				// TODO Auto-generated catch block
    	    				e.printStackTrace();
    	    			}
     
    	    		}
    	    	};
    t.start();
    Des idées pour soulager l'utilisation de mon processeur???

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Cette classe ne fait rien de spéciale, c'est bizarre...
    Tu es sûr des 70% ? C'est une application qui ne fait rien d'autre qu'attendre plusieurs secondes pour ton test ?
    En ajoutant des lignes de debug, notamment à la fin de la méthode "run" pour voir si le programme en sort, ça donne quoi ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Merci pour cette réponse rapide, mais il n'y a pas de pose dans le thread d'animation, le GlassPane est redessiné toutes les millisecondes pour créer un petit effet à l'ouverture et a la fermeture.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    Merci pour cett réponse rapide, mais il n'y a pas de pose dans le thread d'animation, le GlassPane est redessiné toutes les millisecondes pour créer un petit effet à l'ouverture et a la fermeture.
    Oui, j'avais lu trop vite, du coup j'ai modifié mon message pendant que tu y répondais....
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    oui je suis sûr des 65% à 70% d'utilisation de l'UC. Pourtant j'ai un très bon processeur ...
    J'ai testé avec seulement une pose de quelques secondes, sans traitement, comme indiqué dans cet exemple ...

    J'ai essayer de faire quelques lignes de debug dans la méthode run, je ne vois aucun soucis apparent...

    Bysar pourtant cette classe me parait assez triviale a par le fait qu'elle se redessine toutes les millisecondes, mais ça je suis obligé de le faire

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Je repose les bases du fonctionnement pour être sûr qu'on soit d'accord.
    1. fondu rapide du GlassPane sur 255 couleurs
    2. pendant ce fondu, le traitement très long se déroule
    3. fin du traitement très long, fondu du GlassPane sur 255 couleurs
    4. la fenêtre devient réutilisable


    L'usage de la CPU à 70% est uniquement pendant les 2 fondus, c'est bien ça ?
    Le processeur va calculer à fond, sans aucune pause, la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alphaLevel = (int) (255 * (System.currentTimeMillis() - start) / rampDelay);
    et le faire probablement plusieurs fois par millisecondes.
    L'oeil humain moyen ne voit plus de saccades d'images à partir d'environ 24 images par seconde. Donc une nouvelle couleur toutes les 40 ms suffirait.
    Tu pourrais donc faire une pause de 40ms (ou un tout petit peu moins genre 30ms) avant chaque changement de couleur sans aucune différence visuel.
    Par contre, ton processeur t'en sera reconnaissant ;-)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Teste ce code, juste pour voir ce qu'en pense ton processeur :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    import javax.swing.JComponent;
    import javax.swing.JFrame;
     
    public class DarkGlassPane extends JComponent implements MouseListener
    {
    	public static void main( String arg[] )
    	{
    		final DarkGlassPane glassPane = new DarkGlassPane();
    		JFrame frame = new JFrame();
    		frame.setSize( 640, 480 );
    		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		frame.setGlassPane( glassPane );
    		frame.setVisible( true );
    		new Thread() {
    			public void run()
    			{
    				try
    				{
    					glassPane.start();
    					System.out.println( "debut traitement long" );
    					Thread.sleep( 10000 );
    					System.out.println( "fin traitement long" );
    					glassPane.stop();
    				}
    				catch( InterruptedException e ) { e.printStackTrace(); }
     
    			}
    		}.start();
    	}
     
    	private static final long serialVersionUID = 1L;
     
    	private Animator animator;
    	private int alphaLevel;
     
    	public DarkGlassPane() { this.animator = null; }
     
    	public void start()
    	{
    		if( animator == null )
    		{
    			addMouseListener( this );
    			setVisible( true );
     
    			animator = new Animator();
    			new Thread( animator ).start();
    		}
    	}
     
    	public void stop()
    	{
    		if( animator != null ) { animator.stop(); }
    	}
     
    	public void paintComponent( Graphics g )
    	{
    		g.setColor( new Color( 0, 0, 0, alphaLevel ) );
    		g.fillRect( 0, 0, getWidth(), getHeight() );
    	}
     
    	private class Animator implements Runnable
    	{
    		private boolean started;
     
    		protected Animator() { started = true; }
     
    		public void stop() { started = false; }
     
    		public void run()
    		{
    			alphaLevel = 1;
     
    			while( alphaLevel > 0 )
    			{
    				if( started )
    				{
    					if( alphaLevel < 255 ) { ++alphaLevel; }
    				}
    				else
    				{
    					if( alphaLevel > 0 ) { --alphaLevel; }
    				}
    				repaint();
    				try { Thread.sleep( 30 ); } catch( InterruptedException exc ){}
    			}
     
    			setVisible( false );
    			removeMouseListener( DarkGlassPane.this );
    		}
    	}
     
    	public void mouseClicked( MouseEvent e ) {}
    	public void mousePressed( MouseEvent e ) {}
    	public void mouseReleased( MouseEvent e ) {}
    	public void mouseEntered( MouseEvent e ) {}
    	public void mouseExited( MouseEvent e ) {}
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Effectivement tu m'avais mis sur la piste d'une pause dans la boucle lors de ta première réponse que tu as modifié par la suite. J'avais donc rajouté et la charge du CPU est tombé de 65% à 5% d'utilisation

    La charge du CPU n'était pas plus importante pendant le fondu mais durant toute la durée du thread.

    L'oeil humain moyen ne voit plus de saccades d'images à partir d'environ 24 images par seconde. Donc une nouvelle couleur toutes les 40 ms suffirait.
    Tu pourrais donc faire une pause de 40ms (ou un tout petit peu moins genre 30ms) avant chaque changement de couleur sans aucune différence visuel.
    Bien sur on ne parle pas ici de l'oeil de Sébastien Loeb

    Merci beaucoup pour toutes ces explications très précises et très précieuses pour moi.

    ++

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

Discussions similaires

  1. [ventillateur processeur] Problème de compatibilité
    Par Ministar dans le forum Composants
    Réponses: 3
    Dernier message: 12/06/2007, 16h01
  2. Problème d'utilisation processeur
    Par Debhian dans le forum SDL
    Réponses: 3
    Dernier message: 20/04/2007, 16h53
  3. Problème dans le choix d'un processeur
    Par Max Payne dans le forum Composants
    Réponses: 8
    Dernier message: 31/01/2007, 13h15
  4. GlassPane et JDialog -> problème de rafraichissement
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 22/08/2006, 09h12
  5. Problème de détection de nouveau processeur
    Par zakfa dans le forum Composants
    Réponses: 12
    Dernier message: 24/01/2005, 17h09

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