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

Java Discussion :

Problème timer méthode wait


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 140
    Par défaut Problème timer méthode wait
    Salut à tous,

    je suis en train de concevoir une application et j'ai un petit problème. Je possède un bouton sur mon interface graphique pour pouvoir interrompre le jeu. Quand je clique dessus, il atterit dans la méthode suivante pour mettre en pause mon Timer(de la classe swing.Timer). Je remarque que mon programme reste dans l'exécution de timer.wait() et n'exécute jamais stopwatch.stop()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void pauseGame() {
     
    		if (!avatarToPlay.isAI()) {
    			interrupted = true;
     
    			synchronized (timer) {
    				try {
    					timer.wait();
    					stopWatch.stop();
    				} catch (InterruptedException e) {
    				}
    			}
    		}
    	}
    merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Par défaut
    Salut

    le code que tu donnes n'est pas suffisant, c'est dur de deviner de quels types sont tes objets pas vrai?

    Moi je n'ai pas l'habitude des timers. Cependant, si la méthode wait que tu utilises est celle de la classe Object, la javadoc est très claire:

    Après l'appel de la méthode wait, l'objet va dormir jusqu'à ce que la méthode notify ou notifyall soit appelée. Si tu ne l'appelles pas, l'objet dormira indéfinimént
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 140
    Par défaut
    timer est en fait une instance de la classe Timer du package de swing.
    Quand je fais appel à la méthode ci-dessous, il affiche bien 'avant appel' mais pas 'apres appel'. Pourtant, pas d'erreurs apparait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void pauseGame() {
     
           synchronized (timer) {
    		try {
                            System.out.println("avant appel");
    			timer.wait();
    			System.out.println("apres appel');
    		} catch (InterruptedException e) {
    		}
    	}
    }

  4. #4
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    on peux voir le code qui fait timer.notify() ?

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 140
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void resumeGame() {
    	interrupted = false;
     
    	synchronized (timer) {
    		timer.notify();
    		stopWatch.start();
    	}
    }

  6. #6
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ces méthodes sont appelées comment? Dans quels threads? Pourquoi voulez vous arrêter le thread courant (appel wait()) plutot que de juste arrêter le timer ( stop )?

  7. #7
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Il me semble qu'il y a un problème de logique dans l'utilisation du mot-clé "synchronized" Java.

    En effet, celui-ci est utilisé pour l'implémentation de section critique et l'exclusion mutuelle.
    J'en prend pour fait cette article :
    http://rom.developpez.com/java-synchronisation/#LII-A

    Or ici, le la fonction "wait()" bloque la section critique associé à la variable "timer".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    synchronized (timer) {
    try {
    	timer.wait();
    	stopWatch.stop();
    } catch (InterruptedException e) {
    }
    }
    Ce qui implique que le code suivant ne peut d’exécuter temps qu'on ne sort pas du code précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    synchronized (timer) {
    	timer.notify();
    	stopWatch.start();
    }
    Or il faut un timer.notify() pour sortir du premier synchronized.

    Il y a selon moi un problème de conception.

    Si tu veux vraiment avoir un jeu qui se place en pause utilise une variable boolean "isPlaying" que tu vérifie à chaque pas de ton jeu.
    Si celle-ci est à false tu ne modifie pas l'état du jeu et tu affiche ce qu'il faut.

    EDIT :
    @tchize_ : Merci pour l'information, je n'étais en effet pas au courant pour la libération du synchronized sur le wait.
    Note that the wait method, as it places the current thread into the wait set for this object, unlocks only this object; any other objects on which the current thread may be synchronized remain locked while the thread waits.
    En effet cela fonction, le test 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
    27
    28
    29
    30
    public class Test implements Runnable{
    	public static  String tit = "dd";
    	public static void main(String[] args) {
    		new Thread(new Test()).start();
    		new Thread(new TestNotify()).start();
    	}
    	@Override
    	public void run() {
    		synchronized (tit) {
    			try {
    				System.out.println("start wait");
    				tit.wait();
    				System.out.println("Stop wait");
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    class TestNotify implements Runnable {
     
    	@Override
    	public void run() {
    		synchronized (Test.tit) {
    			System.out.println("Start notify");
    			Test.tit.notify();
    			System.out.println("End notify");		
    		}
    	}
    }
    donne le résulat :
    start wait
    Start notify
    End notify
    Stop wait
    ou
    Start notify
    End notify
    start wait
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  8. #8
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    @kolodz, vous devriez lire la doc de wait(), elle mentionne explicitement qu'il faut faire ce synchronized et que wait va le libérer au moment de s'endormir pour le récupérer au moment de son réveil.

    Il y a effectivement je pense erreur de conception, mais elle ne se situe pas là

Discussions similaires

  1. Problème avec méthode "cloneNode()"
    Par kingmandrax dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/10/2006, 14h14
  2. Problème de méthode
    Par Thibaut_Dupont dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 10/07/2006, 14h16
  3. problème de méthode paint()
    Par guillaumeM63 dans le forum 2D
    Réponses: 2
    Dernier message: 16/05/2006, 23h50
  4. problème bizarre, méthode recurssive
    Par akrobat dans le forum C++
    Réponses: 19
    Dernier message: 05/05/2006, 14h22
  5. Problème de méthode
    Par Clad3 dans le forum C++
    Réponses: 2
    Dernier message: 10/09/2005, 11h08

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