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

avec Java Discussion :

Une pause dans un programme


Sujet :

avec Java

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Par défaut [résolut] Une pause dans un programme
    ca peu paraitre idiot, mais la, vraiment, je trouve pas.

    J'explique la situation :

    une interface graphique avec 2 bouton, l'un d'eux permet d'exécuter le bon déroulement du programme. mais je voudrai que par un second appui sur ce bouton, le programme se "mette en pause" jusqu'au prochain appui du bouton.

    pour faire dérouler le programme, j'utilise un TimerTask que je lance avec un Timer.

    voici le code de mon bouton :
    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
    final Timer time = new Timer();
    JButton lect = new JButton("Lecture");
    MouseListener ml_lect = new MouseListener(){
     
    	public void mouseClicked(MouseEvent arg0) {
    	}
     
    	public void mouseEntered(MouseEvent arg0) {
    	}
     
    	public void mouseExited(MouseEvent arg0) {
    	}
     
    	public void mousePressed(MouseEvent arg0) {
    		if(suiv.isEnabled()){
    			time.schedule(tt, 1, 50);
    			suiv.setEnabled(false);
    		}else{
    			tt.cancel();
    			time.purge();
    			suiv.setEnabled(true);
    		}
    	}
    };
    et celui de mon TimerTask :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TimerTask tt = new TimerTask(){
    	public void run() {
    		Evenement e = ech.retourneEtEnlevePremier();
    		e.traiter(ech, pm);
    		stat.paint(stat.getGraphics());
    		mark.paint(mark.getGraphics());
    	}
     
    };

  2. #2
    Membre éclairé
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Par défaut
    salut salut,

    je debutes en java mais pourquoi n'utilises pas la fonction pause()?
    Il me semble que c'est la syntaxe pour java.
    Des que tu appuies sur un bouton tu fais sauter la pause.
    Nan?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Salut,

    la manipulation des "pauses" dans une IHM sous Java est très complexe, je m'y suis cassé les dents plus d'une fois.

    Dans un premier temps il faut savoir que ton interfaçe graphique fait l'objet d'une gestion par Swing dans un thread unique. Il te faut donc prendre en compte cet élément pour la synchronisation de ton événement bouton et la mise en veille de ton processus.

    Selon moi, tu devrais commencer par mettre ton traitement dans un Thread, lorsque tu déclenches l'événement (appui sur bouton pause), tu bascules le flag de mise en pause à l'intérieur de ton Thread. De cette manière, grâce à une boucle dans ta méthode run() de ton Thread, tu peux contrôler l'exécution ou la mise en pause du Thread. Seul toi peux le faire dans la gestion de ton thread, le système ne le fera pas à ta place.

    De plus, il faut synchroniser le thread de Swing et celui de ton processus, utilise pour cela le mot clé synchronized et peut-être un sémaphore ?

    Voilà, j'espère que ca contribuera à t'aider...

  4. #4
    Membre éprouvé
    Profil pro
    Devops
    Inscrit en
    Août 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Devops

    Informations forums :
    Inscription : Août 2006
    Messages : 107
    Par défaut
    Regarde du coté du SwingWorker, cela semble un peu lourd au premier abord mais c'est la solution de SUN pour les travaux long avec une GUI.

    Etends la classe et rajoute une fonction du type activePause() qui leve un drapeau et test regulièrement l'etat de ce drapeau dans la boucle du traitement long. En fonction de l'etat du drapeau, soit tu bosses soit tu sleep(...) quelques centaine de millisecond.

    La solution plus classe et d'utiliser notify() et wait()

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    Puisque tu utilises une TimerTask, qui implémente l'interface Runnable, une bonne solution est sans doute, comme le dit Iyoiyo, d'utiliser notify() et wait().

    L'idée de wait() est de suspendre l'exécution du thread en cours (ici le TimerTask tt). Il est recommendé d'appeler cette méthode dans une boucle.
    Tu peux par exemple modifier ton TimerTask avec le code suivant:
    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
     
    TimerTask tt = new TimerTask(){
     
            private boolean enPause=false;
    	public void run() {
                    enPause=false;
    		Evenement e = ech.retourneEtEnlevePremier();
    		e.traiter(ech, pm);
    		stat.paint(stat.getGraphics());
    		mark.paint(mark.getGraphics());
    	}
     
            public synchronized mettreEnPause() {
                    enPause=true;
                    while(enPause) {
                         try {
                               wait();
                         } catch (InterruptedException e) {}
                    }
            }
     
            public synchronized stopperLaPause() {
                   enPause = false;
                   notifyAll();
            }
    };
    Quand tu appelles mettreEnPause(), on rentre dans la boucle une seule fois en fait. Au passage de wait(), le thread libère le lock (méthode synchronisée) et se met en pause, attendant qu'un autre thread appelle notify() ou notifyAll(). C'est le cas quand on appelle stopperLaPause().

    Cordialement.

  6. #6
    Membre éprouvé
    Profil pro
    Devops
    Inscrit en
    Août 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Devops

    Informations forums :
    Inscription : Août 2006
    Messages : 107
    Par défaut
    Pas mieux...

  7. #7
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Par défaut
    en fait, je me suis renseigner ailleurs aussi, et effectivement, j'ai changer ma façon de penser.

    déjà, j'ai oublier les timer et TimerTask, ils ne sont pas adapter a mon problème. J'ai tout simplement lancer un Thread avec une boucle while(true) et un booléen qui change d'état selon l'appui du bouton.

    Merci pour vos réponses, elles sont tout de même intéressante. et surement plus "propre" vu que je me retrouve avec un Thread qui contient une boucle infini. Mais c'est très suffisant pour ce que je veut faire.

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

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, 00h54
  2. Réponses: 9
    Dernier message: 18/12/2009, 00h36
  3. Faire une pause dans un programme
    Par jorg1n dans le forum C
    Réponses: 1
    Dernier message: 12/11/2007, 12h02
  4. Réponses: 18
    Dernier message: 07/06/2007, 18h43
  5. Faire une pause dans le programme
    Par shinobi dans le forum Access
    Réponses: 6
    Dernier message: 13/06/2005, 16h37

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