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

Concurrence et multi-thread Java Discussion :

Problème de thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut Problème de thread
    Bonjour,
    J'ai le problème suivant avec un programme :
    Pour résumer, mon programme comporte un bouton qui, quand je clique dessus lance une animation graphique. Quand je reclique dessus cette animation se met en pause, puis quand je reclique, l'animation repart, et ainsi de suite. Je pense que vous avez compris...
    J'ai donc créé un thread dont la méthode run() est du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void run(){
    while(true){
    rafraichirAnimation();
    }
    }
    Puis j'ai un écouteur du bouton dont la méthode mouseClick() est du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(bouton == pause){
    synchronized(this){
    wait();}}
    else{
    synchronized(this){
    notifyAll();
    }}
    }
    j'ai éludé les détails de mise à jour du texte du bouton...
    Le problème c'est que je voudrais agir sur mon thread lorsque j'appelle wait() et pas sur un quelconque objet.
    Alors je sais bien que wait() et notify() sont des méthodes de Object mais alors comment agir sur mon thread en les mettant dans cette méthode mouseClick() ?
    Merci pour votre réponse.
    Virgile.

  2. #2
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    Entre ton mouseClicked et ton thread il va y avoir un rendez-vous. Pour un rendez-vous, il faut un repère commun. Ce repère commun sera un objet, sur lequel tu vas synchroniser les deux cotés.

    en gros non testé non vérifié non compilé sans garantie avec de GROSSES ERREURS de conception :
    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
     
    Object rendezVous;
     
    public void run()
    {
     synchronized (rendezVous)
     {
      while (true)
      {
        rendezVous.wait();
        youpiJePeuxYALLER();
      }
     }
    }
     
    public void mouseClicked()
    {
     synchronized (rendezVous)
     {
      rendezVous.notifyAll();
     }
    }
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut
    Merci,
    Je vais essayer. Mais n'y a-t-il pas un moyen de mettre wait et notifyAll dans la méthode mouseClick ? il me semble qu'il serait plus logique de gérer l'attente et la notification dans mouseClick vu que c'est le fait de cliquer sur le bouton qui décide de l'arrêt ou de la reprise de l'animation.
    Qu'en pensez-vous ?
    Merci.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut
    Encore une chose :
    Je crois avoir compris ce que vous voulez dire. En fait il faut un objet qui permette une sorte de communication entre l'exécution de run() et mouseClick(). Mais en fait peu importe le type de cet objet ? Ce peut être n'importe quel objet de n'importe quel type pourvu qu'il soit toujours référencé lors du déroulement du programme ? n'est-ce pas ? il est donc juste là pour permettre cette communication ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ce qu(il faut comprendre, c'est que x.wait() , çà met en pause le Thread qui fait l'appel, pas le Thread qui possède cette méthode. Tout objet en java peut servir de sémaphore. Le principe est


    Thread 1: attend sur unObjet.wait()

    Thread 2: fait démarrer le Thread 1 en attente en faisant unObjet.notify()

    Ca, c'est pour le redémarrage.

    Pour l'arrêt, il faut mettre ne place un flag que Thread 1, dans sa boucle, va lire. Si il est à true, Thread 1 va faire unObject.wait() (hop, arrêt). Mais il faut aussi un duxième objet, qui notifie Thread 2 que Thread1 est arrêté (histoire de pas etre tenté, dans Thread2, de faire redémarrer Thread1 avant son arrêt :p)

    Y a des excellente docs sur le net à propos de la synchronisation de Threads.

  6. #6
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    J'avais pas tilté qu'il fallait gérer le lancement et l'arrêt de l'animation dans le mouseClicked, je croyais qu'il ne fallait gérer que le lancement.

    Cela dit j'ai l'impression que tu as compris le principe, surtout avec les compléments de tchize_. Donc il faut adapter, et puis voilà. Un arrêt n'est qu'une action supplémentaire.

    Une fois que tu auras traité à l'arrache le problème, et donc que tu auras mieux compris les notions en cause, tu pourras t'intéresser au SwingWorker, et au paquetage java.util.concurrent, qui font ça tout seul mieux que nous
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut
    Merci,
    Je vais essayé de me débrouiller avec tout cela.
    Virgile.

Discussions similaires

  1. Problème de thread : Plus de ressources système
    Par OliverSleep dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/02/2006, 15h35
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 10h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 16h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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