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

AWT/Swing Java Discussion :

[JPanel] un thread pas très catholique...


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de calogerogigante
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Avril 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2003
    Messages : 608
    Par défaut [JPanel] un thread pas très catholique...
    Bonjour les éclairés du java !!

    Voilà, je me lance simultanément dans le dégrossisage des threads et du double buffering.

    Ma question est la suivante, concernant le thread :
    Dans mon JPanel, j'ai une classe qui étends Thread, la voici :

    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
    public class ThreadDeDessin extends Thread
      {
      private boolean tuer = false;
      public void run()
        {
          while( true )
            {
            try {
                preparerProchainPoint();
                repaint();
                sleep(100);
                }
            catch( InterruptedException e ) { }
            if ( tuer ) return;
            }
        }
      public void arreter()
        {
        tuer = true;
        }
      }
    Et j'ai trois méthodes externes pour lancer, tuer et reprendre un thread.

    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
    public void demarrerThread()
      {
      thr.start();
      }
     
    public void arreterThread()
      {
      thr.arreter();
      }
     
    public void reprendreThread()
      {
      thr = new ThreadDeDessin();
      thr.start();
      }
    Je ne suis pas certain que la méthode du relancement soit bonne (càd re-créer une nouvelle instance de ma classe ThreadDeDessin à chaque redémarrage de l'action de dessiner aléatoirement).
    Pourtant, mon petit programme test fonctionne parfaitement.

    Si vous pouviez me dire ce que vous en pensez, ça pourrait m'aider...
    (Voir les fichiers sources complets attachés à ce post).

  2. #2
    Membre éclairé Avatar de calogerogigante
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Avril 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2003
    Messages : 608
    Par défaut
    Personne n'est chaud pour un petit commentaire sur la façon dont j'ai géré mes threads ?

    Je voudrais juste savoir s'il est concevable de gérer un thread comme je l'ai fait ?


  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il y a pire comme méthode, déja tu n'utilise pas la dangereuse et deprecated méthode stop() de ton thread

  4. #4
    Membre éclairé Avatar de calogerogigante
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Avril 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2003
    Messages : 608
    Par défaut
    Ma crainte est de me retrouver avec des tas de petites instances de ma classe ThreadDeDessin (cf à chaque redémarrage du traçage aléatoire), et que le Garbage Collector ne se mette à freiner l'application quand il nettoiera les instances perdues, si je devais utiliser un jour cette façon de faire dans une application plus importante et plus gourmande en nombre de thread utilisé.

    Si quelqu'un a une autre méthode que celle que j'ai appliqué tout seul comme un grand , je suis preneur, chers amis...

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tout dépend de tes besoins
    Si un seul thread te suffit => Singleton (regarde les sources de dvp pour le singleton en environnement threadé)
    Si tu nécessite plus de threads mais que tu veux en limiter le nombre un petit pool de threads pourraient faire l'affaire

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Par défaut
    moi jai deja utiliser la methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tonThreads.resulme();
    cette methose reprends ton threads ou il cetait arreter

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Malheureusement pour toi jeune homme tu vas devoir arrêter de l'utiliser car elle est deprecated et considérée dangereuse....
    Et puis dans le cas présent je ne vois pas trop bien le rapport avec le sujet

  8. #8
    Membre éclairé Avatar de calogerogigante
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Avril 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2003
    Messages : 608
    Par défaut
    Benh, en fait, si, ça colle avec mon sujet, car mon soucis est bien de faire le plus proprement possible le codage d'un thread qu'on puisse lancer, arrêter, et surtout, redémarrer. Toutes ces méthodes deprecated sont frustrantes...

    J'ai été voir, ami Sinok, le tutoriel de Developpez sur le thread en singleton. Mais je l'ai trouvé assez compliqué.

    J'avais essayé d'abord comme ça (en singleton), mais mon problème, je ne sais pas pourquoi, mon compilateur refusait de surcharger la méthode stop().
    Pourquoi ? Aucune idée...

    Si quelqu'un a l'habilité de transformer mon petit exemple avec un beau Thread en singleton, et codé dans les règles de l'Art, je ne demande qu'à apprendre !!

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Par défaut
    desole javais oublie quelle etaient depreciated...

    mais ca devient vraiment soulant ces "depreciated"...

  10. #10
    Membre éclairé Avatar de calogerogigante
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Avril 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2003
    Messages : 608
    Par défaut
    J'ai trouvé une variante plus propre pour stopper et relancer mon thread, sans devoir à chaque fois en créer une nouvelle instance :

    Dans la classe PanneauDeDessin :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    public void demarrerThread()
      {
      thr.start();
      }
     
    public void arreterThread()
      {
      thr.arreter();
      }
     
    public void reprendreThread()
      {
      thr.tuer = false;
      }
     
    public class ThreadDeDessin extends Thread
      {
      public boolean tuer = false;
      public void run()
        {
          while( true )
            {
            if ( !tuer )
              {
              try {
                  preparerProchainPoint();
                  repaint();
                  sleep(100);
                  }
              catch( InterruptedException e ) { }
              }
            }
        }
      public void arreter()
        {
        tuer = true;
        }
      }
    Ca tourne bien... Si personne n'a d'autres commentaires, je mets ce post en résolu, car c'est OK pour moi.

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

Discussions similaires

  1. [Timer]Timer pas très précis
    Par harold63 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 25/07/2005, 08h36
  2. [Dessin JPanel] Generer dessin pas a pas
    Par -=Spoon=- dans le forum 2D
    Réponses: 2
    Dernier message: 03/12/2004, 22h41
  3. 2 SELECT Qui ne s'entendent pas très bien entre eux :(
    Par moutanakid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/08/2004, 16h46

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