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

Concurrence et multi-thread Java Discussion :

[Thread] besoin sleep(delay)... car java mobilise CPU


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Points : 12
    Points
    12
    Par défaut [Thread] besoin sleep(delay)... car java mobilise CPU
    Bonjour
    J'ai fais un programme simple qui m'affiche des lignes dont les cordonnées varient.
    Mon pb : apparemment quand on fait une boucle infinie dans le
    'public void paint(Graphics g) {' cela prend plus de 50% du CPU et donc Windows se bat pour afficher les fenêtres des appli ouvertes et je dois faire avec peine un 'fin de tâche' sur IE pour fermer le browser.
    (Avec les Applets de démo dont je dispose tout va bien).
    Comment svp intégrer la fonction sleep(delay) pour "endormir" un peu l'exécution du prog ?
    MERCI
    Ex de CODE:
    while(continu==1) {
    i++; if (i==100) {i=1;col++;
    if (col==2) col=0;
    if (col==0) g.setColor(Color.red);
    if (col==1) g.setColor(Color.blue);}
    g.drawLine(1,1,i,100); }

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut Re: besoin sleep(delay)... car java mobilise CPU
    Citation Envoyé par thierry198
    apparemment quand on fait une boucle infinie dans le 'public void paint(Graphics g)' cela prend plus de 50% du CPU
    je ne comprend pas trop le sens d'une boucle infinie dans le paint()... même pas du tout !

    la méthode paint() est censé réaliser comme travail l'affichage des différents dessins et leur mise à jour... Si tu as vraiment besoin d'une boucle infinie, mets-la autour de tes appels à paint() ou repaint()

    ensuite pour "calmer la bête" dans un boucle infinie, tu peux utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try{
      Thread.sleep(100); // sleep de 100 ms
    }catch(InterruptedException e){
      e.printStackTrace();
    }
    mais je pense que tu devras bientôt recourir au multi-threading...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    Salut,

    Je ne sais pas si une boucle infinie dans un une méthode paint soit une bonne chose, car cela bloque tout refraichissement de l'IHM.
    Ne vaut-il pas mieux utiliser un timer ?

    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
    //Classe qui va être exécutée à chaque passage du timer.
    public class MaTache implements ActionListener{
      //Composant à redessiner
      JComponent _composant;
      //Le constructeur récupère le composant à redessisner
      public MaTache (Component composant){
        _composant=composant;
      }
      //Redessiner le composant
      public void actionPerformed(ActionEvent e) {
        Rectangle r = _composant.getSize();
        r.setLocation(_composant.getX(),_composant.getY());
        _composant.repaint(r);
      }
    }
     
    //Créer le timer qui rafraichira le composant (ici, toutesles munites).
    javax.swing.Timer monTimer = new javax.swing.Timer(1000,tache);

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Pb : repaint() efface l'écran...
    En effet cela bloque IE et du coup Windows est très mal en point tant que je ne fais pas un 'fin de tâche de IE'.
    J'ai "réussi" le petit prog suivant (fini les pb de cpu!) mais le défaut (qui peu être des fois une qualité) c'est que le repaint() m'efface l'écran avant de ré-exécuter le 'public void paint(Graphics g) {'.
    quelle est svp la fonction qui permet de ré-exécuter le 'public void paint(Graphics g) {' sans effacer le contenu de mon applet ?
    Merci
    Voici mon code :
    public class Applet_essai extends java.applet.Applet implements Runnable
    {
    Thread mon_thread = null;
    int delay=100; int a=0;
    public void paint(Graphics g) {
    super.paint(g);
    a = (int)( 500 * Math.random());
    g.drawLine(1,1,700,a);
    }
    public void start() {
    mon_thread = new Thread(this);
    mon_thread.start();
    }
    public void run() {
    Thread me = Thread.currentThread();
    while (mon_thread == me) {
    try {
    Thread.currentThread().sleep(delay);
    }
    catch (InterruptedException e) { }
    repaint();
    }
    }
    }

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut Re: Pb : repaint() efface l'écran...
    Citation Envoyé par thierry198
    quelle est svp la fonction qui permet de ré-exécuter le 'public void paint(Graphics g) {' sans effacer le contenu de mon applet ?
    ce n'est pas le repaint() qui t'efface ton applet, mais bel et bien le paint()

    repaint() ne fait qu'appeler paint() et paintComponent() (et aussi 2-3 autres trucs je sais plus trop)

    mais la méthode qui efface c'est paint()...

    tu pourrais peut-être utiliser le double buffering si les problème de clipping sont trops importants...
    http://java.developpez.com/faq/java/...oublebuffering

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Points : 12
    Points
    12
    Par défaut repaint()...
    Je vais regarder le lien...
    Merci à tous

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

Discussions similaires

  1. Besoin d'un projet java executable
    Par Grumphette dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 17/07/2008, 15h54
  2. [VB2005] Thread and Sleep
    Par Kropernic dans le forum Windows Forms
    Réponses: 6
    Dernier message: 25/06/2008, 16h34
  3. [Débutant] [Thread] Faire patienter un programme java....
    Par yoxx dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 25/09/2005, 12h36
  4. threads et sleep
    Par buzzz dans le forum Windows
    Réponses: 2
    Dernier message: 19/02/2005, 01h54

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