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 :

Gestion des threads


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Par défaut Gestion des threads
    Bonsoir à tous !

    J'ai une classe principale qui contient des méthodes dont une qui me sert à charger les réservations dans une jTable. J'ai une autre classe qui fonctionne en tâche de fond via un thread et qui consulte à partir d'un URL si une nouvelle réservation est arrivée.
    Tout ça fonctionne très bien mais cependant j'ai un soucis que je ne sais pas résoudre et qui est le suivant :

    Une fois que ma réservation est récupérée à partir de ma classe Thread comment est ce que je peux recharger ma jTable qui est dans ma classe principale ?
    Actuellement, je suis obligé de fermer et réouvrir le programme pour faire cela c'est pas l'idéal.

    Voici un extrait de mon code :

    La classe principale :
    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
     
        public static void main(String args[]) {        
     
            /* On créé et affiche le formulaire */
            java.awt.EventQueue.invokeLater(() -> {
                BuildResa fenetre;
                try {
                    fenetre = new BuildResa();
                    fenetre.setVisible(true); 
                    fenetre.setLocationRelativeTo(null);
     
                    /** On démarre le thread pour les résas auto */
                    CheckResaAuto resaAuto = new CheckResaAuto("BookingAuto");
                    resaAuto.start();
     
                } catch (IOException | ParserConfigurationException | SAXException ex) {
     
                }             
            });
        }
    La méthode que je veux réinvoquer pour réinitialiser ma jTable (elle se trouve dans la même classe que le code ci-dessus) :
    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
     
        /** CHARGEMENT DES DONNEES CLIENT */
        @SuppressWarnings("empty-statement")
        private void LoadDataCustomer() throws SAXException, IOException, ParserConfigurationException{
     
            Document document;
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
     
            document = builder.parse(new InputSource(xmlDocCustomer));                
     
            ScanCustomer = new CustomerScanner(document);
     
            ScanCustomer.visitDocument();
     
            listCustomer = ScanCustomer.getListClient();     
     
            /** Trie les clients */
            listCustomer.sort((t1, t2) -> {return t1.getLastname().compareTo(t2.getLastname());});
     
            listCustomer.stream().filter((client) -> (!client.getLastname().equals(""))).map((client) -> {
                DefaultTableModel modele3 = (DefaultTableModel)jTableClient.getModel();
                Object[] obj = new Object[4];
                obj[0] = client.getLastname();
                obj[1] = client.getFirstname();
                if(client.getType().equals("idcard")){
                    obj[2] = client.getId();
                }else{
                    obj[3] = client.getId();
                }
                modele3.addRow(obj);
                return modele3;
            }).map((modele3) -> {
                jTableClient.setModel(modele3);
                return modele3;
            }).forEach((_item) -> {
                jTableClient.repaint();
            });
        }
    Pour finir la classe qui tourne en tâche de fond :
    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 class CheckResaAuto extends Thread {
        @Override
        public void run(){        
            while(bThreadContinu) {
                try {            
                    /** on marque une pause toutes les x secondes */
                    sleep(6000);
     
                    /** URL contenant les réservations */
                    URL resaURL = new URL("http://www.xxx.fr/");
                    URLConnection uc;
                    uc = resaURL.openConnection();
     
                    try (BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()))) {
                        String inputLine = in.readLine();
     
                        /** On écrit le texte qui a été récupéré dans un fichier avec pour extension en xml */                                                            
                        if(!inputLine.equals("NO-BOOKING")){  
                            try {
                                try {
                                    WriteFileTmp(inputLine);
                                } catch (ParseException ex) {
                                    Logger.getLogger(CheckResaAuto.class.getName()).log(Level.SEVERE, null, ex);
                                }
                            } catch (ParserConfigurationException | SAXException ex) {
                                Logger.getLogger(CheckResaAuto.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                } catch (IOException | InterruptedException ex) {
     
                    /** Arrêt du thread sur erreur */
                    bThreadContinu = false;
                }
            }
        }
    }

    En vous remerciant d'avance à tous.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    En principe, il suffit de passer l'instance sur laquelle appeler la méthode de chargement au thread quand tu l'instancies. Je dis en principe parce que la méthode LoadDataCustomer est private, donc ne peut être appelée de l'extérieur de la classe, mais à priori il devrait y avoir une méthode public qui l'appelle, sinon il faut en ajouter une.

    Principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class ClassQuiChargeLaJTable {
     
       public void rechargerFichierDansLaJTable() {
           ...
       }
     
    }
    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
    public class ClassDeChargementDuFichier extends Thread {
     
        private ClassQuiChargerLaJTable chargeur;
     
        public ClassDeChargementDuFichier(ClassQuiChargerLaJTable chargeur) {
            this.chargeur=chargeur;
        }
     
        public void run() {
     
            while(running) {
     
                  attendre();
     
                  telechargerFichier();
                  chargeur.rechargerFichierDansLaJTable();
     
            }
     
        }
     
    }

    Par ailleurs, je vois plein de catch vides dans ton code : très mauvais, car en cas d'exception, non seulement tu ne le sauras pas, mais tu ne sauras pas ce qu'il s'est passé, alors que ça peut être utile, voire indispensable de savoir qu'il y a un problème et lequel. Au moins tracer ou loguer, sinon renvoyer vers l'appelant en encapsulant l'exception dans une RuntimeException, pour qu'elle remonte jusqu'au en "haut".

    Sinon, pourquoi arrêter le thread en cas d'IOException ? En cas de problème lors du téléchargement, le thread s'arrête, alors que réessayer plus tard pourrait fonctionner.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Par défaut
    Bonjour Joël !

    Désolé de répondre aussi tardivement mais j'avais pas eu le temps de faire les essais avant maintenant donc, j'ai mis en application ce que tu as noté et bien évidemment ........ ça fonctionne parfaitement.

    Je peux donc clore le sujet et te remercier pour ton aide.

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

Discussions similaires

  1. gestion des threads
    Par yanis97 dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 12h41
  2. Gestion des Threads
    Par Nalfouille dans le forum MFC
    Réponses: 3
    Dernier message: 05/04/2006, 16h29
  3. Gestion des threads
    Par yanis97 dans le forum C++
    Réponses: 6
    Dernier message: 08/03/2006, 09h39
  4. GEstion des thread
    Par Julien Dufour dans le forum Access
    Réponses: 8
    Dernier message: 06/10/2004, 14h28
  5. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40

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