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

Langage Java Discussion :

Pause pendant le programme


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Par défaut Pause pendant le programme
    Bonjour à tous,

    je cherche à faire une pause (une demi-seconde par exemple) pendant mon programme java, mais la méthode que j'utilise (Thread.sleep) me pose problème.

    Je m'explique : mon code est le suivant :

    ... //calculs

    g.repaint // je mets à jour la fenêtre de dessin


    // Pour faire la pause d'une demi-seconde

    try {
    Thread.sleep(500);
    }
    catch (InterruptedException e) { e.printStackTrace();
    }


    ... // calculs

    g.repaint // pour remettre à jour la fenêtre de dessin.


    Le problème est qu'en faisant comme ca, il ne fait pas le premier repaint (il fait de suite la pause après les premiers calculs),
    il fait bien la pause d'une demi-seconde, et seulement après un fait un repaint (en faisant les deux mises à jour en une seule fois).


    Pourriez vous m'expliquer pourquoi il fait cela, et comment y remédier svp ?


    Merci d'avance

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    j'ai pas bien saisi ton explication, mais je pense que cela ne se fait pas dans le même fil d'exécution.

    Un repaint() est une méthode Thread-safe, elle s'exécute dans l'EDT. Lorsque tu fait un Thread.sleep(int), cela se fait dans le thread courant (enfin, d'après ce que tu indique).

    Je pense que tu veux faire une pause entre les 2 repaint();

    Peut-être en mettant ton sleep dans l'EDT...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Par défaut
    Pas tout compris là ^^

    Je vais essayer d'être plus clair sur mon problème,

    en fait je fais un repaint, un Thread.sleep, puis des calculs et un nouveau repaint,

    et à l'exécution, il ne me fait pas le premier repaint, il me fait la pause puis le deuxième repaint.



    Qu'est ce que l'EDT ?

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    EDT = Event Dispatching Thread.

    Pour ce genre de choses, il ne faut pas employer sleep, mais wait. Le wait libère le scheduler, et le EDT, donc, peut s'exécuter et faire le premier repaint.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Par défaut
    Ok merci,

    mais peux tu m'expliquer comment l'utiliser stp ?

    Je n'ai pas réussi...

  6. #6
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Comme solution, tu peux utiliser ces deux méthodes de SwingUtilities :
    invokeAndWait(Runnable doRun)
    invokeLater(Runnable doRun)

    La première solution serait de mettre le premier repaint dans un Thread et utiliser un invokeLater. Et ensuite faire un Thread.sleep() comme tu l'as fait.

    La deuxième solution serait de mettre le sleep() et le deuxième repaint dans un Thread avec un invokeAndWait.

  7. #7
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Object pourAttendre;
     
    pourAttendre = new Object();
    synchronized (pourAttendre)
    {
     pourAttendre.wait(30000); // 30 secondes.
    }

  8. #8
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    De grande chance que ca marche pas si le code de traitement est justement dans le fil de l'ed. Le wait libère le verrou, certes mais l'edt est tjs bloqué.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Par défaut
    En effet, la solution de gifffftane ne marche pas.

    Je n'ai pas encore essayé celle de darkxan.

    Sinon Tommy31, comment puis-je faire autrement dans ce cas là ?

    J'ai aussi essayé de mettre une simple boucle à 100 000 itérations, mais ca me fait la même chose

  10. #10
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Pour la première solution (qui n'est pas la meilleure je pense) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    try {
                        // repaint()
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            });
    Une autre solution est de programmer un TimerTask toutes les deux secondes. Voir la classe Timer et TimerTask.

  11. #11
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Oui grooo ok j'avais oublié que on pouvait être dans l'edt, c'était pour voir si vous suiviez, vous aurez corrigé vous mêmes on est tous champions !

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Par défaut
    Darkxan, je ne comprends pas trop ta solution,

    où est-ce que j'entre la durée de la pause ?


    J'ai essayé de mettre ce que tu m'as proposé à la place du repaint (en enlevant le try/catch, sinon il me met une erreur...), puis de mettre un Thread.sleep(500), mais il me fait toujours la même chose...

  13. #13
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Si tu es dans l'EDT effectivement ça ne devrait pas marcher. Donc pour la solution 1, il faut faire :

    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
    new Thread(new Runnable() {
      public void run() {
    	// Calculs
    	SwingUtilities.invokeLater(new Runnable() {
    		public void run() {
    			g.repaint();
    		}
    	}
     
    	Thread.sleep(2000);
     
    	// Calculs
    	SwingUtilities.invokeLater(new Runnable() {
    		public void run() {
    			g.repaint();
    		}
    	}
      }
    }).start();
    Tu pourrais faire une boucle si tu veux que ça le fasse indéfiniment.


    L'autre solution dont j'avais parlé avant est de faire un TimerTask.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TimerTask task = new TimerTask() {
    	public void run() {
    		// Calculs
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				g.repaint();
    			}
    		}
    	}
    }
    new Timer().schedule(task, new Date(), 2000);
    EDIT: Je viens de trouver par hasard qu'il existe une meilleure solution. Il existe en faite une classe Timer dans le package swing.
    http://java.sun.com/docs/books/tutor...isc/timer.html
    http://java.sun.com/products/jfc/tsc/articles/timer/

Discussions similaires

  1. Mettre une pause dans un programme
    Par PNL dans le forum Général Java
    Réponses: 12
    Dernier message: 28/01/2016, 01h54
  2. [Débutant] Pause dans un programme en mode console ?
    Par pugnator dans le forum Langage
    Réponses: 2
    Dernier message: 15/12/2006, 13h08
  3. [C#]Comment eviter Exception pendant que programme en pause?
    Par Revan012 dans le forum Windows Forms
    Réponses: 11
    Dernier message: 11/03/2006, 04h05
  4. Pause dans un programme Pro*C
    Par Veve44 dans le forum C
    Réponses: 5
    Dernier message: 11/10/2005, 18h49
  5. Faire une pause dans le programme
    Par shinobi dans le forum Access
    Réponses: 6
    Dernier message: 13/06/2005, 17h37

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