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 :

Bloquage d'une méthode avec wait()


Sujet :

avec Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Bloquage d'une méthode avec wait()
    Bonjour, dans le cadre d'un projet pour mes études je développe un logiciel de retouche d'images.
    Pour les effets spéciaux j'aimerai qu'une boite de dialogue s'affiche permettant à l'utilisateur de modifier des valeurs qui seront appliquées à l'image (par exemple pour la luminosité on aura un JSlider et un JTextField permettant de modifier la valeur).
    Pour chaque effet j'implémente une interface "Plugin" qui contient cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public BufferedImage modify(BufferedImage bi)
    	{		
    		this.bi = bi;		
    		this.afficherIHM();
     
    		return this.bi;
    	}
    Le problème est que la ligne "return this.bi" est exécutée directement une fois que la boite de dialogue est affichée, donc avec les valeurs par défaut.
    J'ai donc ajouté une synchronisation comme ceci :
    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
    	public BufferedImage modify(BufferedImage bi)
    	{		
    		this.bi = bi;		
    		this.afficherIHM();
     
    		synchronized(this){
    		while (this.pret==false)
    		{
    			try {
    				this.wait();
    			}
    			catch(InterruptedException e) {}
    		}
    		}
     
    		return this.bi;
    	}
    La méthode notify() est appelée lorsque je clique sur le bouton de la boite de dialogue.

    Le problème est qu'au lieu de ne bloquer que la méthode modify(), le wait() bloque toute l'application.
    J'ai essayé d'appliquer cette méthode avec un exemple simple, le wait() ne bloque que la fonction qui l'appelle, je ne comprend donc pas d'où peut venir l'erreur.

    Si quelqu'un a une idée, soit sur comment corriger mon problème, soit sur une méthode plus simple à utiliser, merci de m'en faire part.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Salut,

    Place ton bout de code dans un autre thread.
    Tu trouveras ici un tuto super intéressant au sujet des threads avec SWING (notamment comment ne pas "geler" toute l'appli lors d'un clic sur un bouton avec un gros traitement en arrière plan)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse, mais cela ne répond pas à mon problème.
    Je voudrais juste que ma fonction se mette en pause en attendant un clique sur un bouton. Les méthodes comme invokeAndWait() ou invokeLater() ne sont pas appliquables pour ça.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Dans modify(), pourquoi tu fais un synchronized? Et c'est quoi la variable "pret"? Si tu souhaite juste "attendre", tu peux faire un Thread.sleep(1000) (avec 1000 en ms) dans un while, mais je pense pas que ça soit la meilleur idée, mieux vaut déclencher directement un événement, qui va mettre à jour ton image via un listenner sur ton JtextField...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Pour le synchronized() si je ne le fais pas ça ne marche pas tout simplement.
    La variable "pret" est la condition qui va permettre de débloquer la fonction modify()
    Le problème est que ma méthode afficheIHM() n'est pas bloquante, donc quand j'appelle ma fonction elle va d'abord retourner l'image bi qui était en paramètre, puis une fois que je vais valider mes paramètres avec la boite de dialogue elle me retournera une 2e image.
    Le wait() doit me permettre d'attendre que la boite de dialogue soit fermée avant de continuer l'exécution de la fonction.

    Pour info si je fais un sleep le problème est le même : c'est l'application qui se bloque et non la fonction.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Dans ce cas je persiste et je signe, mon premier post doit t'aider à résoudre ton problème... Si tu souhaite bloquer seulement la fonction courante et pas toute l'appli, il te faut migrer toute cette partie dans un autre thread séparé.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    pour rappel: on ne fait pas de traitement lourd ni ne met en pose *jamais* le thread swing. Tout les traitements longs doivent etre migrés dans des thread à part!

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé votre méthode le résultat est le même : la JFrame une fois affichée se bloque complètement, au lieu de juste bloquer la fonction

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Tu peux montrer le code?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je ne vois pas trop quoi montrer comme code, comme j'ai dit la méthode est bonne puisqu'elle marche avec un exemple "simple" qui suit le même processus (lancement de l'appli, exécution de la fonction, bloquage et attente du click sur le bouton, affichage de la valeur), pourtant sur mon cas la JFrame plante.
    J'ai essayé de faire bloquer la méthode sans utiliser de Thread le résultat est le même : la méthode marche pour mon exemple simple et pas sur mon code.

  11. #11
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Ta méthode modify est appelée d'où? Dans un actionPerformed?

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Stop les prises de têtes j'ai trouvé la solution, et j'ai presque envie de me tirer une balle tellement elle est simple comparée à ce que je cherchais :
    il m'a suffit de remplacer la JFrame par une JDialog, parce que la JDialog est bloquante et pas la JFrame ...
    Bref pas besoin de wait() ou de Thread ou tout autre chose inutile ...
    Enfin tout est bien qui finit bien et merci à ceux qui ont essayé de m'aider

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/02/2010, 15h54
  2. Créer une méthode avec un timeout
    Par damien77 dans le forum Débuter avec Java
    Réponses: 35
    Dernier message: 20/02/2009, 16h05
  3. appel d'une méthode avec plusieurs paramètres
    Par soujava dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/05/2008, 23h30
  4. Réponses: 2
    Dernier message: 09/01/2008, 11h18
  5. appeler une méthode avec paramètre dans une page JSP
    Par javasmif dans le forum Struts 2
    Réponses: 1
    Dernier message: 06/12/2007, 10h48

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