Wait & notify

fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 - 21 févr. 2007 à 18:32
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 - 15 mars 2007 à 15:38
Bonjour,
j'essais de suspendre le déroulement d'une classe pendant que mon objet est en action.
Voici mon code:
//Création de l'objet formulaire

Formulaire form = new
Formulaire();

//Affichage

form.setVisible(true
);

try
{

this
.wait();

}

catch
(InterruptedException e){

e.printStackTrace();

}
Lorsque l'utilisateur à fini de remplir le formulaire, ma classe formulaire fait un notify( ).
Mais le wait et le notify me donnent une erreur: IllegalMonitorStateException.

Merci de m'aider.

12 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
21 févr. 2007 à 19:50
Salut,

il faut que tu synchronise la méthode qui fait le notify

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014
21 févr. 2007 à 21:08
Y aurait-il peut-être une autre façon de faire qui permettrait que l'utilisateur remplisse le formulaire puis qu'après le proccesus de ma première classe continu ??
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
21 févr. 2007 à 21:28
Salut,

oui mais ton prob est simplement et uniquement une question de synchro

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014
21 févr. 2007 à 21:44
Ok, et comment est-ce que je devrais faire pour les synchroniser ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
21 févr. 2007 à 21:49
tu creer simplement une méthode

public synchronized void wakeUp(){
    notify();
}

et tu appel cette méthode et si toute fois cela merdouille(je sais plus si il faut aussi synchroniser la methode qui a le wait ou l'inverse) tu synchronise aussi celle qui a le wait soit :

public synchronized void maMethode(){
    //Création de l'objet formulaire

    Formulaire form = new
Formulaire();

    //Affichage

    form.setVisible(true
);

    try
{

        this
.wait();

    }

    catch
(InterruptedException e){

        e.printStackTrace();

    }
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014
21 févr. 2007 à 22:07
Salut, j'ai fait comme tu m'as dit. J'ai synchronisé la méthode qui cré l'objet et dans la classe ou est l'objet je n'ai pas eu à synchroniser la méthode qui appele le notify( ).

Mais j'ai un autre problème, mon objet est un JFrame, lorsque l'objet est créé la fenêtre s'ouvre mais elle reste grise il n'y a rien à l'intérieur. Pourtant ce n'est pas mon objet qui a un problème, car je suis capable de l'exécuté correctement lorsque que je le fais sans wait dans la classe ou il se trouve déja.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
21 févr. 2007 à 22:14
Salut,

 déporte le traitement dans un thread

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014
22 févr. 2007 à 03:56
Salut,
désoler je m'y connais pas trop dans le Thread pis tous ça. Comment tu le déporte dans un Thread ?
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
22 févr. 2007 à 09:08
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>
</title>
<meta name="GENERATOR" content="OpenOffice.org 2.0 (Linux)" />
<meta name="AUTHOR" content="bob bob" />
<meta name="CREATED" content="20070222;9080500" />
<meta name="CHANGED" content="16010101;0" />
<style type="text/css">
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-->
</style>
Salut,

cela dépend de
comment est fait ton code donc sans le code je ne pourrai pas te dire
qui doit être dans un thread ... mais sache juste que le prob
de fenêtre grise c'est normal vu que tu met en wait le thread
main donc fatalement si il est en wait il ne peut s'occuper de
l'affichage de ta fenêtre







------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014
22 févr. 2007 à 16:18
Ok, mais mon wait( ) ne s'exécute pas dans ma méthode main. J'ai une classe qui crée mon objet, qui contient le wait et le notify. Puis j'ai une autre classe qui crée l'objet.

Pourtant quand j'exécute l'objet dans la classe qui le contient je n'ai pas de problème ??
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014
15 mars 2007 à 15:36
Bonjour, j'ai construit 2 classes pour simplement tester le fonctionnement des threads avant de le mettre dans mon programme.

Mais je ne comprend pas pourquoi, mais mon notify() ne réveille pas mon wait() ???

Voici le code de mes 2 classes:
public

class Appel
extends Thread{

public
static
void main(String[] args) {
Appel test=
new Appel();
}

public Appel(){

new Thread(
new Test(),
"Test Thread").start();
setWaiting();
System.
out .println(
"Fin d'exécution!");
System.exit(0);
}

public
synchronized
void setWaiting(){

try{

this.wait();
}

catch(InterruptedException e){
e.printStackTrace();
}
}}

----------------------
public

class Test
implements Runnable{

public
void run(){

for (
int i = 0; i < 10; i++){
System.
out.println(i);
}
wakeUp();
}

public
synchronized
void wakeUp(){
notifyAll();
}}

Tout s'exécute bien sauf que je ne vois jamais le message: "Fin d'exécution!"

Merci de m'aider
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014
15 mars 2007 à 15:38
Désolé l'affichage du code de mes classes ne s'est pas très bien effectué
0
Rejoignez-nous