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

JSF Java Discussion :

Bouton pour stopper un traitement


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Par défaut Bouton pour stopper un traitement
    Bonjour,
    j'ai une table qui contient une liste d'élements et deux boutons devant chaque ligne pour démarrer et stopper un traitement

    le problème c'est que je peux démarrer mon thread normalement mais une fois que je clique sur pause pour le stopper, ça ne marche pas.
    le bouton démarrer est destiné pour executer la methode suivante:
    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 void editValide(CompagneBean compagne) {
            selectedCompagne=compagne;
            Connection conn = Database1.getConnection();
            System.out.println("--------- this ------ " + selectedCompagne.relatedtable);
     
            String table=selectedCompagne.relatedtable;
            HttpSession session = com.beans.Util.getSession();
     
     
             session.setAttribute("table", selectedCompagne.relatedtable);
     
     
             RunThread r= new RunThread(table);
             Thread t = new Thread(r);
             t.run();
     
            FacesMessage message = new FacesMessage("Success !!!", "votre compagne pour  " + this.user + " a été validée avec succès ");
     
                FacesContext.getCurrentInstance().addMessage(null, message);
        }
    comme on peut le voir icic on a démarré le thread RunThread avec succès.mais si je veux cliquer sur pause, comment fait-on pour faire référence à mon thread qui est déjà en cours pour pouvoir appeler la méthode t.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
    15
    16
    17
    <p:column  width="100px">
                        <f:facet name="header">  
                            <h:outputText value="valider" />  
                        </f:facet>
                        <p:commandButton value="valider" actionListener="#{compagne.editValide(o)}"  >
     
                        </p:commandButton>
                    </p:column>
     
                     <p:column  width="100px">
                        <f:facet name="header">  
                            <h:outputText value="pause" />  
                        </f:facet>
                         <p:commandButton value="pause" actionListener="#{compagne.stopp}"  >
     
                        </p:commandButton>
                    </p:column>

    merci

  2. #2
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2011
    Messages : 20
    Par défaut
    Une piste peut être:

    - Get thread Id après la création du thread, et stocker le qlq part,
    - Après, get thread by Id, pour récupérer le thread et puis stopper le.

  3. #3
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Par défaut
    merci pour votre réponse mais si je fais tout d'abord un
    je vais récupérér l'id de mon thread et par la suite je le récupére dans une variable session (session.setAttribute("id",id))
    mais si dans une autre methode qui n'est autre que
    comment je fais pour appeler la methode thread.stop() sur mon ancien thread que j'ai déjà sauvegardé son id?

    y-a til une autre méthode faire une pause pour un thread

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Bonjour,
    Y'a une réponse toute simple à ton besoin:
    -Tu commences par mettre ton managegBean en scope session
    -Tu rends ton attribut Tread en attribut membre de ton ManagedBean
    Comme suit :
    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
    public class TonManagedBeanEnScopeSession{
    private RunThread r=null;
    ...
    
    public void editValide(CompagneBean compagne) {
            selectedCompagne=compagne;
            Connection conn = Database1.getConnection();
            System.out.println("--------- this ------ " + selectedCompagne.relatedtable);
     
            String table=selectedCompagne.relatedtable;
            HttpSession session = com.beans.Util.getSession();
     
     
             session.setAttribute("table", selectedCompagne.relatedtable);
     
     
              r= new RunThread(table);
             Thread t = new Thread(r);
             t.run();
     
            FacesMessage message = new FacesMessage("Success !!!", "votre compagne pour  " + this.user + " a été validée avec succès ");
     
                FacesContext.getCurrentInstance().addMessage(null, message);
        }
    ...
    public void stopp(){
    r.stop();
    }

  5. #5
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Par défaut
    merci pour votre réponse mais r implemente l'interface runnable donc on ne peut pas faire et meme si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread t= new Thread(r)
    t.stop()
    ça ne marchera pas vu que ce n'est pas le meme thread

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    C'etait plus l'idée à developper afin de répondre à ton besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class TonManagedBeanEnScopeSession{
    private RunThread r=null;
    Thread t =null;
    ...
    r= new RunThread(table);
    t= new Thread(r);
    t.run();
    ...
    //Plus loin
    t.stop();

  7. #7
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2011
    Messages : 20
    Par défaut
    Bonjour,

    Pouvez vous essayer ce code (j'ai pas testé, mais vite trouvé)?
    ThreadGroup currentGroup =
    Thread.currentThread().getThreadGroup();
    int noThreads = currentGroup.activeCount();
    Thread[] lstThreads = new Thread[noThreads];
    currentGroup.enumerate(lstThreads);
    for (int i = 0; i < noThreads; i++)
    System.out.println("Thread " + i + " = "
    + lstThreads[i].getId());

    Mettez le après le code t.start().
    Puis mettez le dans la méthode stop de ton bean.

    L'idée c'est de voir si ton bean gère les même threads ou pas, et pour trouver l'id sauvegardé de votre thread.

    Je pense que votre bean sera mieux en session scope que request scope.

  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
    Tu as remarqué que Thread.stop() était une méthode dépréciée? Il ne faut PAS PAS et encore PAS l'utiliser. Ca ne fait de toutes façons pas ce que tu pense. Si tu veux arrêter ton traitement, tu rajoute dans ta classe de traitement un boolean "arreteSilTePlait" que tu passe à true pour arrêter. Et dans ton traitement, tu vérifie régulièrement cette valeur pour faire un arrêt bien propre.

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 59
    Par défaut
    Mode Barbare activé!

    do{
    if(bouton.checked){
    Break; de la mort!}}

    Ceci dit, merci pour les précédentes réponses qui m'on aidé.

  10. #10
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Par défaut
    merci pour vos réponse.
    J'ai ajouté un flag boolean arret=false pour quitter mon thread comme suit

    voici mon managedBean qui contient la methode qui appelle le thread et la methode qui implémente le 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    @ManagedBean(name = "compagne")
    @SessionScoped
    public class CompagneBean implements Serializable {
    private RunThread r=null;
    private Thread t=null;
     
     public static volatile boolean arreteSilTePlait;
     
        public synchronized boolean isArreteSilTePlait() {
            return arreteSilTePlait;
        }
     
        public  synchronized void setArreteSilTePlait(boolean arreteSilTePlait) {
            this.arreteSilTePlait = arreteSilTePlait;
        }
     
     
        public CompagneBean getSelectedCompagne() {
            return selectedCompagne;
        }
     
        public void setSelectedCompagne(CompagneBean selectedCompagne) {
            this.selectedCompagne = selectedCompagne;
        }
     
     
     
     public synchronized void lancer(CompagneBean compagne) {
            FacesMessage message = new FacesMessage("Success !!!", "votre compagne  a été lancée avec succès ");
     
                FacesContext.getCurrentInstance().addMessage(null, message);
            selectedCompagne=compagne;
            Connection conn = Database1.getConnection();
     
     
            HttpSession session = com.beans.Util.getSession();
             System.out.println("--------- after get session of editeTable --------------");
             session.setAttribute("id", id);
             session.setAttribute("table", selectedCompagne.relatedtable);
     
             System.out.println("--------- after setting session of editeTable --------------");
             this.arreteSilTePlait=true;
              r= new RunThread(selectedCompagne.relatedtable);
             t = new Thread(r);
             t.setDaemon(true);
             t.run();
     
     
     
        }
         public synchronized boolean stopp() {
             System.out.println("pausing process....");
             this.arreteSilTePlait=false;
              System.out.println("arretSilTePlait= "+this.arreteSilTePlait);
            // t.stop();
              return this.arreteSilTePlait;
           }
    voici 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    public  class RunThread implements Runnable{
       String a;
       boolean actif;
       
    
        public RunThread(String a) {
            this.a = a;
            
    		
        }
       
         
        
            public void run() {
            try {
    			
                           
                            
    			DemarrerService(URL, table, id);
    
    			//Timer t1 = new Timer();
    			//t1.schedule(new RunThread(), delay);
    		} catch (Exception e) {
    		
    			e.printStackTrace();
    		}
        }
    
    
     public static void DemarrerService(String CONVERTER_URL, String table, String idBulk) {
    
                    int solde=0;
                    int nbre_total=0;
                    Connection connection=null;
                    Statement stmt1=null;
                    ResultSet rset1=null;
                   
                    HttpSession session = com.beans.Util.getSession();
    
     String sql="select id,num_tel,header from "+table+" where traiter='non' limit 10";
                    System.out.println("------------------------------ sql done -----------------");
                    
                    try{
                        System.out.println("------------------------------ before connection -----------------"+sql);
                      
                        connection = dao.Database.getConnection();
                        System.out.println("----- connection is OK ------");
                        nbre_total=Commons.compterNbre(table, connection);
                        
                        if(connection !=null && !connection.isClosed()){
                            stmt1= connection.createStatement();
                            rset1= stmt1.executeQuery(sql);
                            System.out.println("***********"+beans.CompagneBean.arreteSilTePlait);  // --> cette valeur est tjrs true
                            while(rset1.next()) {
                                id= rset1.getString("id");
                                System.out.println("-------le id de la com-------");
                                phoneNumber = rset1.getString("num_tel");
                                
                                header=rset1.getString("header");
                              /// traitement...

    le problème ici c'est que la methode stop() n'est appelée qu'apres que le thread ne soit terminé et du cout la valeur du flaf arretstp ne se met à false que lorsque le thread soit terminé.

    Que faire?!!!

  11. #11
    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
    Donne nous plus de code (car là ton runThread est partiel), donne nous le nom de la méthode que tu utilise, ce que tu as comme résultat, et ce que tu voudrais comme résultat. Pour le moment, c'est tout sauf clair pour moi.
    Aussi, je vois le mot clé static partout. Ce mot clé ne devrait même pas exister dans une application web!!!

  12. #12
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Par défaut
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    public  class RunThread implements Runnable{
       String a;
       boolean actif;
     
     
        public RunThread(String a) {
            this.a = a;
     
     
        }
     
     
     
            public void run() {
            try {
     
                            URL url = new URL("http://xxxxxx.com");
     
                            String CONVERTER_URL=url.toString();
                            System.out.println("Converter url -->"+CONVERTER_URL);
     
     
                            String ShortNumber ="smart";
                            String id="aa";
                            String table="";
                            if (table =="" && id=="aa"){
                                HttpSession session = com.beans.Util.getSession();
     
                            table=session.getAttribute("table").toString();
                            idBulk=session.getAttribute("id").toString();
                            }
     
     
    			DemarrerService(CONVERTER_URL, table, id);
     
     
    		} catch (Exception e) {
     
    			e.printStackTrace();
    		}
        }
     
        public static void DemarrerService(String CONVERTER_URL, String table, String id) {
     
                    int solde=0;
                    int nbre_total=0;
                    Connection connection=null;
                    Statement stmt1=null;
                    ResultSet rset1=null;
     
                    System.out.println("---------------------------------- avant getsession");
                    HttpSession session = com.beans.Util.getSession();
     
                   // HttpSession session = Util.getSession();
     
     
     
                    String id="";
                    String header="";
                    String header_table="";
                    String phoneNumber="";
     
     
     
                    String sql="select id,num_tel,header from "+table+" where traiter='non' limit 10";
                    System.out.println("------------------------------ sql done -----------------");
     
                    try{
                        System.out.println("------------------------------ before connection -----------------"+sql);
     
                        connection = dao.Database.getConnection();
                        System.out.println("----- connection is OK ------");
                        nbre_total=Commons.compterNbre(table, connection);
     
                        System.out.println("----- nbre totale des element dans la  table------"+nbre_total);
                        if(connection !=null && !connection.isClosed()){
                            stmt1= connection.createStatement();
                            rset1= stmt1.executeQuery(sql);
                            System.out.println("***********"+beans.CompagneBean.arreteSilTePlait);
                            while(rset1.next()) {
                                id= rset1.getString("id");
                                System.out.println("-------le id de la com-------");
                                phoneNumber = rset1.getString("num_tel");
     
                                header=rset1.getString("header");
     
                                // traitement des lignes de base de donnée
                                //  je veux stoper le traitement apres le traitement de qlq lignes de la BD
     
                                   if (condition)
                                {
                                    Commons.UpdateCompagneValide(id,table, connection);
                                    System.out.println(phoneNumber+"\n");
                                    System.out.println("-------- numero de tel ---- "+phoneNumber+ " done successfully");
                                    solde++;
                                    if (beans.CompagneBean.arreteSilTePlait==false)
                                        break;
                                    try{
    // faire une pause de 10 secondes entre le traitement de chacune des lignes pour laisser le temps pour mettre en pause
                                    Thread.sleep(10000);
    }
                                    catch (Exception e){
                                        e.printStackTrace();
                                    }
                                    // notifier l'utilisateur que le traitement est terminé
                                    if (solde==nbre_total){
                                        //call notification
     
     
     
                                         boolean updateSolde= Commons.updateSolde(id, solde, connection);
                                        System.out.println("-------Suppression de la table-------");
                                       // boolean deleteTable=Commons.SupprimerTable(table, connection);
                                        System.out.println("-------delete OK -------");
     
     
                                    }
     
                                }
                                else{
                                    Commons.UpdateCompagneErr(id,table, connection);
                                    System.out.println("------erreur --------");
     
                                }
     
                            }
                        }
                        stmt1.close();
                        connection.close();
     
     
                    }
                    catch(Exception e){
                        e.printStackTrace();
     
                    }
     
     
     
     
        }
    }

  13. #13
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Par défaut
    il n'y a personne pour m'aider?je n'arrive pas à comprendre pourquoi la methode de stop() ne s'execute qu'après l'execution entiere du thread que je vais arreter.

  14. #14
    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
    Ton code, excuse moi des mots, est un foutoir. Ca part dans tous les sens. On est dans CompagneBean, mais on passe un CompagneBean aux méthodes, on a du static partout, on a des méthode synchronized sans raison particulière, on a des méthodes qui ont des noms bizarres (stopp au lieu de stop?). Donc forcément, c'est pas facile de t'aider.

    en l'occurence, je vois ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     public synchronized void lancer(CompagneBean compagne) {
            //......
             t = new Thread(r);
             t.setDaemon(true);
             t.run();
     
     
     
        }
         public synchronized boolean stopp() {
    La première méthode ne lance pas de nouveau thread. Pour démarrer un Thread, la méthode start(), et le nouveau Thread lancera le run, à part.
    Du coup du ne sort pas de lancer tant que le Thread n'a pas fini
    Du coup, vu les mots clé synchronized, tu ne peux pas rentrer dans stopp tant que le thread n'a pas fini

Discussions similaires

  1. Bouton pour stopper une macro
    Par Kestion100 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/05/2015, 20h18
  2. Gestion des erreurs pour stopper le traitement
    Par DEMMAR dans le forum SAS Base
    Réponses: 3
    Dernier message: 20/04/2011, 15h21
  3. Bouton pour interrompre traitement
    Par pjmorce dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 26/02/2009, 14h11
  4. Bouton "cancel" pour stopper des macros
    Par primax dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/08/2007, 15h42
  5. Besoin d'une idée pour stopper un traitement
    Par Yannick_from_31 dans le forum Général Java
    Réponses: 5
    Dernier message: 01/06/2007, 12h27

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