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

EDT/SwingWorker Java Discussion :

Enchainer plusieurs Threads "graphique"


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut Enchainer plusieurs Threads "graphique"
    Bonjour,

    J'ai un problème que je n'arrive pas à résoudre, j'avais déjà posté le sujet mais je n'arrive pas à le retrouver alors j'en poste un nouveau (désolé)...

    En fait, j'ai un fonction de qui lit un fichier, et insère les données dans un base ce qui prend plusieurs secondes... Pour que l'utilisateur sache ou le processus en est, j'ai donc mis une progressBar pour suivre l'avancement, seulement, pour que cela marche, je suis donc obligé de mettre ce traitement dans un nouveau Thread que je lance en parallèle de l'application principale.

    Seulement voilà, j'aimerais que l'utilisateur puisse saisir plusieurs fichiers en même temps, et que la lecture s'enchaine, chaque fichiers doit être lu un par un...

    Si je fait une boucle, il me lance les traitements en même temps et donc les progressBar en même temps, et on n'y comprend plus grand chose...

    Donc je voudrais faire en sorte que le programme principal attende la fin du traitement d'un fichier pour passer à l'autre...

    En gros, je veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Début T1 => Fin T1 => Début T2 => Fin T2 etc...
    Et pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Début T1 => Début T2 => Fin T1 => Fin T2 ...
    J'ai essayé Mais je ne voit pas le défilement de la progressBar...

    Quelqu'un aurait une idée pour m'aider ?

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Qu'est-ce que tu utilises pour lancer tes traitements ?

    Tu pourrais te tourner vers les Executors

    a++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut
    Pour lancer le traitement dans un nouveau thread j'utilise simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Traitement t1 = new Traitement();
    t1.start();
    Et ma classe Traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Traitement extends Thread {
     public void run() {
      try {
       traiterFichier();
       JOptionPane.showMessageDialog(null, "Traitement effectué, "Succès", JOptionPane.INFORMATION_MESSAGE);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }
    	}
    Je vais jeter un coup d'oeil aux Executors pour voir.

    Merci pour l'info.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Avec les exécutors tu peux directement implémenter Runnable à la place d'étendre Thread (le thread est géré tout seule).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Traitement implements Runnable {
    Ensuite tu te crées un instance d'Executors de type single-thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final Executor EXECUTOR = Executors.newSingleThreadExecutor();
    C'est à dire que tu auras un seul thread qui traitera les demandes les unes à la suite des autres...

    Ensuite, au lieu de lancer le thread, tu demande simplement à l'exécutor de l'exécuter, ce qu'il fera dès que c'est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Traitement t1 = new Traitement();
    EXECUTOR.execute(t1);

    Il existe plusieurs types d'executors en standard, qui permettent diverses choses (utiliser un cache de thread, ou un certain nombre de thread...)

    a++

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut
    Merci pour ces précisions, je pense par contre avoir un soucis au niveau de la structure de mon code...

    En fait j'ai une classe qui demande les fichiers à l'utilisateur, et qui s'occupe de les lire.

    Seulement, pour chaque fichiers, j'initialise plusieurs variables, et il est possible que l'utilisateur doivent saisir des infos. A la suite de quoi, je lance le thread qui permet d'afficher la barre de progression...

    Pour faire simple :

    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
    public Principal(BddTransport bdd, File [] toRead) {
    		getFile();
    		lireFichier();
    	}
    private void getFile() {
    		try {
    			JFileChooser choix = new 
    			choix.setFileSelectionMode(JFileChooser.FILES_ONLY);
    			choix.setMultiSelectionEnabled(true);
    			choix.setDialogTitle("Selectionner les fichiers à lire");
    			choix.setApproveButtonText("Lire");
    			if (choix.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
    				filesToRead = choix.getSelectedFiles();
    			}
    		} catch (Exception ex) {
    		}
    	}
    public void lireFichier() {
    		for (int x=0; x<filesToRead.length;x++) {
    			if (filesToRead[x] == null) return;
    			currentFile = filesToRead[x];
    			int offset = offsetEF(idInformation);
    			if (offset == -1) {
    				JOptionPane.showMessageDialog(null,
    						"Pas d'information");
    return;
     
    			}
    			readInformation(offset);
    			verifInformation();
    		}
    }
     
    void verifInformation() {
    		if (!personne.load(idPersonne)) {
    			creer();
    		} else {
    			stock();
    		}
    	}
    void stock() {
     Traitement t1 = new Traitement();
     t1.start();
    }
    Donc, si j'essaie de lancer les Thread via la classe Executor, même si ca fonctionne comme je l'ai compris, il va recommencer le traitement du second fichier, avant de s'arrêter de nouveau au lancement du second Thread de traitement...

    Si tu pouvais me donner une confirmation avant que je me lance dans la restructuration total du processus...

    Je vais faire des tests pour voir si ca pourrait fonctionner...

    Merci pour ton aide.

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RR instinct Voir le message
    Donc, si j'essaie de lancer les Thread via la classe Executor, même si ca fonctionne comme je l'ai compris, il va recommencer le traitement du second fichier, avant de s'arrêter de nouveau au lancement du second Thread de traitement...
    Oui... si j'ai bien compris ton code...

    Pourquoi tous ces traitements ne font pas partis du thread ???

    a++


    PS : Attention aux catchs vide... c'est assez vicieux comme piège !

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