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 :

[Thread] Thread dans controller


Sujet :

Java

  1. #1
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut [Thread] Thread dans controller
    Bonjour à tous,

    Contexte :

    Une application avec interface graphique (Swing) exécute un script shell.

    L'exécution pouvant durer un moment, elle est lancée à l'intérieur d'un thread afin de continuer à utiliser l'interface graphique, seul le bouton d'exécution devient disabled tant que le thread existe.

    Dans une version antérieure le thread était créé directement dans la vue et le comportement voulu était obtenu.

    Actuellement, dans un respect du pattern MVC un controller a été ajouté, le thread est créé dans ce controller.

    Problème :

    Durant l'exécution du shell le thread ne semble pas fonctionner, il y a donc une perte de la main sur l'interface graphique durant celui ci.

    Aide souhaitée :

    M'expliquer pourquoi le thread ne permet plus de garder la main sur l'interface graphique pendant que l'exécution suit son cours.

    Controller :

    Dans la méthode startExecution() un ExecutingThread est créé, il implémente Runnable. Le thread.start() lance donc la méthode run() d'ExecutingThread qui execute mon script.
    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
    public class ExecutingController {
     
        private MainWindows myVue;
     
        public ExecutingController(MainWindows aVue){
            this.myVue=aVue;
        }
     
        public void startExecution(){
            if(myVue.getjRadioButton1().isSelected()){
                if(myVue.getjTable1().getSelectedRow()!=-1){
                    Thread thread = new Thread(new ExecutingThread(((ScriptsIntoJTable)myVue.getjTable1().getModel()).getConfigAt(myVue.getjTable1().getSelectedRow())));
                    thread.start();
                    while(true){
                        if(!thread.isAlive()){
                            myVue.getjButton1().setEnabled(true);
                            break;
                        }
                    }
                }
                else{
                    javax.swing.JOptionPane.showMessageDialog(null,"Aucune configue selectionnée");
                }
            }
        }
    méthode qui appelle le controller, elle est dans la vue permettant l'exécution. C'est pas très propre car générée par l'éditeur graphique de Netbeans.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            // TODO add your handling code here:
            this.jButton1.setEnabled(false);
            this.controller.startExecution();
    }

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    La boucle infinie while de la méthode startExecution s'exécute dans l'EDT, donc fige l'interface graphique.
    Une solution possible : donnée la référence du bouton au Thread. C'est lui qui le rendra enable juste avant de mourir.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    ton idée fonctionne très bien puisqu'elle permet de s'affranchir de la boucle infinie.

    Merci bien

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

Discussions similaires

  1. [Thread] Blocage dans mon programme
    Par Xo Sonic oX dans le forum EDT/SwingWorker
    Réponses: 4
    Dernier message: 18/06/2005, 17h12
  2. [Thread] DB dans un thread
    Par Pedro dans le forum Bases de données
    Réponses: 5
    Dernier message: 02/06/2005, 13h14
  3. [Thread] Recherche dans une BDD
    Par Pedro dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2005, 14h03
  4. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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