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 :

Probleme Activer/Desactiver thread


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Par défaut Probleme Activer/Desactiver thread
    Salut à tous,
    J'ai développer un thread qui compare à chaque fois le nombre de ligne d'une table de ma base de données:

    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
    public boolean verifier(int x) {
            String query2 = "select count(*) from client ";
          try{
                 ResultSet rs=cn.getResultat(query2);
              while (rs.next()) {
               nblignes2 = rs.getInt(1);
                    }
                    rs.close();
              } catch (Exception e) {
          JOptionPane.showMessageDialog(null, "Erreur lors de l'exécution de la requête recherche du nouveau nombre enregistrement client");
                }
     
             if( nblignes2 != x) {
                        //System.exit(-1);
                        return false;
                    }
             else
                    return true;
                }
    et
    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
    public void run(){
     
          String query = "select count(*) from client";
          try{
                 ResultSet rs=cn.getResultat(query);
              while (rs.next()) {
               nblignes = rs.getInt(1);
                    }
                    rs.close();
              } catch (Exception e) {
          JOptionPane.showMessageDialog(null, "Erreur lors de l'exécution de la requête recherche nombre enregistrement client");
               }
        while (!isInterrupted()){
              if (verifier(nblignes)==false){
                   JOptionPane.showMessageDialog(null, "Une modification a été effectué sur la table client");
                   nblignes=nouveaunblignes();
                   //System.out.println("=>"+ nblignes);
                    //System.exit(-1);
              }
                       try {
                       Thread.sleep(7000);
                          } catch (InterruptedException ex) {
                  Logger.getLogger(EspionProduit.class.getName()).log(Level.SEVERE, null, ex);
                 }
     
            }
        }
    ****
    et dans la page d'acceuil j'ai fait un bouton (soit activer, soit desactiver), et je veut que le thread soit activé ou bien activé en fonction du clic de l'utilisateur ... j'ai testé avec ce code :
    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
     EspionClient thread1 = new EspionClient();
     
     
            if (pageacceuil.comptclt % 2 ==0)
            {
     
                actclt.setText("Activer");
                thread1.interrupt();
     
            }
            else {
                 actclt.setText("Desactiver");
                thread1.start();
                }
     
            pageacceuil.comptclt ++;
    Avce actclt est le nom du bouton et comptclt est un compteur pour pouvoir basculer entre l'affichage de "activer" et "desactiver" sur le bouton ...
    L'activation fonctionne parfaitement, mais quand je clique pour désactivé le thread, rien ne se passe et le thread continue a s'exécuté ...
    Que dois-je faire pour arrêter le thread en cliquant sur désactiver?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    Salut,

    c'est l'une des subtilités de l'interruption des threads.
    Un thread a un flag qui indique si il est interrompu. Quand on appelle la méthode interrupt, ce flag est positionné à true. Mais il peut changer suivant les opérations effectuées comme par ex un try catch. Il faut dans ce cas repositionner le flag.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try {
        Thread.sleep(7000);
    } catch (InterruptedException ex) {
        Logger.getLogger(EspionProduit.class.getName()).log(Level.SEVERE, null, ex);
        Thread.currentThread.interrupt(); //repositionne le flag
    }

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Par défaut
    Citation Envoyé par Kirua12 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try {
        Thread.sleep(7000);
    } catch (InterruptedException ex) {
        Logger.getLogger(EspionProduit.class.getName()).log(Level.SEVERE, null, ex);
        Thread.currentThread.interrupt(); //repositionne le flag
    }
    J'ai fait exactement comme vous m'avez signaler mais pas de résultat, le thread continue a travaillé quand je re-clic sur désactiver ...
    ------------------
    Remarque:
    Le code de développement du thread et le code d'initialisation du thread sont dans 2 pages différentes ... c'est à dire je fais la classe thread EspionClient dans une page et je l'instantie dans une autre(EspionProduit thread1 = new EspionThread()

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Par défaut
    J'ai fait aussi comme ça dans la page ou j'initialise le 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
    16
    17
    18
    19
    20
    21
     
     private void actcltActionPerformed(java.awt.event.ActionEvent evt) {                                       
     
            EspionClient thread1 = new EspionClient();
           thread1.start();
     
     
            if (pageacceuil.comptclt % 2 ==0)
            {
     
                actclt.setText("Activer");
                EspionClient.currentThread().interrupt();
     
            }
            else {
                 actclt.setText("Desactiver");
     
                }
     
            pageacceuil.comptclt ++; 
        }
    Mais toujours pas de résultat ...

    ******
    J'ai procédé autrement comme ça ... mais en vin ...

    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
     
    private void actcltActionPerformed(java.awt.event.ActionEvent evt) {                                       
     
            EspionClient thread1 = new EspionClient();
           thread1.start();
           Thread t= EspionClient.currentThread();
     
     
            if (pageacceuil.comptclt % 2 ==0)
            {
     
                actclt.setText("Activer");
                t.interrupt();
     
            }
            else {
                 actclt.setText("Desactiver");
                t.resume();
                }
     
            pageacceuil.comptclt ++; 
        }

  5. #5
    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
    fais sortir ta variable de ta méthode! Tu dois quand même bien te rendre compte qu'à chaque appel de ta méthode tu crée un nouvel objet thread. Je dis ca puisque, visiblement, t'a déjà compris qu'il fallait mettre comptclt ailleurs, alors pourquoi tu le fais pas avec le Thread?

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Par défaut
    Mais si je fais sortir EspionClient thread1 = new EspionClient(); de ma méthode ... le thread1 ne sera pas connu au sein de la méthode et je ne peut pas faire, par la suite, thread1.start() ... et si je fais sortir thread1.start() de ma méthode aussi ... alors le thread va se lancer dés le chargement de la page ....
    Vous avez compris mon problème ....
    Sinon est ce que vous pouvez m'éclaircir un peu ... merci

    Autre chose: Est ce que je dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try {
        Thread.sleep(7000);
    } catch (InterruptedException ex) {
        Logger.getLogger(EspionProduit.class.getName()).log(Level.SEVERE, null, ex);
        Thread.currentThread.interrupt(); //repositionne le flag
    }
    ?

  7. #7
    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
    Citation Envoyé par L'aigle de Carthage Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     EspionClient thread1 = new EspionClient();
     
     
            if (pageacceuil.comptclt % 2 ==0)
            {
     
                actclt.setText("Activer");
                thread1.interrupt();
     
            }
    Avce actclt est le nom du bouton et comptclt est un compteur pour pouvoir basculer entre l'affichage de "activer" et "desactiver" sur le bouton ...
    L'activation fonctionne parfaitement, mais quand je clique pour désactivé le thread, rien ne se passe et le thread continue a s'exécuté ...
    Tu balance là ton interrupt() sur un nouveau thread, alors que ce que tu dois faire, c'est l'envoyer sur le thread que t'as démarré à l'appel précédent. Pour ca, il faut maintenir une référence vers ce thread.

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tu balance là ton interrupt() sur un nouveau thread, alors que ce que tu dois faire, c'est l'envoyer sur le thread que t'as démarré à l'appel précédent. Pour ca, il faut maintenir une référence vers ce thread.

    Merci pour votre réponse, mais je ne sais pas comment maintenir une référence vers mon thread ... Est ce vous pouvez m'expliquez de plus?
    Merci une autre fois

  9. #9
    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
    en le stockant, simplement, dans un champ, comme n'importe quelle donnée que tu devrais conserver entre chaque appel

Discussions similaires

  1. probleme : mon 2eme thread ne s'active pas.
    Par cosmoff dans le forum Général Python
    Réponses: 1
    Dernier message: 26/05/2015, 01h12
  2. Des problemes avec ces threads <pthread.h>
    Par nasamad dans le forum GTK+ avec C & C++
    Réponses: 26
    Dernier message: 07/07/2006, 12h46
  3. [JMenuItem] activer/desactiver
    Par rvfranck dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 11/04/2005, 15h06
  4. les event de IBQuery pour activer,desactiver la Transaction?
    Par amad206 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/03/2005, 14h12
  5. Activer/Desactiver une connexion au réseau local
    Par Yodagobah dans le forum MFC
    Réponses: 7
    Dernier message: 05/01/2005, 17h17

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