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

AWT/Swing Java Discussion :

ProgressBar sans Thread ?


Sujet :

AWT/Swing Java

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut ProgressBar sans Thread ?
    Bonjour,

    J'ai un petit soucis avec les progressBar et si quelqu'un pouvait m'aider, je lui en serais très reconnaissant...

    En fait, j'ai un programme qui permet de traiter des fichiers. Jusque la rien de bien compliqué... On selectionne un fichier, on le traite (cela peut prendre une 30aine de secondes au maximum), pendant ce temps une progressBar affiche la progression, puis une fois fini on a un message de confirmation.

    Quand je lis un fichier donc, pas de problème, le traitement et la ProgressBar sont dans un Thread lorsque l'on a selectionner le fichier, celui ci se déclenche...

    Maintenant, je veux pouvoir lire plusieurs fichiers de manière automatique, c'est à dire qu'au lieu de faire 10 fois la manipulation de selectionner le fichier, le lire, selectionner un nouveau fichier, le lire... etc... Je voudrais qu'on puisse, avec une selection multiple, enchainer la lecture des fichiers.

    Et voilà qu'arrive les problèmes, lorsqu'on lit le premier fichier, on lance le premier Thread de lecture, mais dans le même temps, on continue donc à lire la suite dans le Thread principal, et donc... c'est le bor*el

    En enlevant du thread, ca se lit certes, mais la barre de progression n'est plus une barre de progression...

    Quelqu'un a une idée ? Quelqu'un a compris au moins ? Y-a-t-il au moins une solution ?

    Merci d'avance !

  2. #2
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Et si tu fais un Thread pour gérer tout les "petits" Threads de traitement. Chaque petit Thread ferait un wait() sur le Thread principal au début de l'analyse de fichier et un notifiy() à la fin. Ton applic ne serait pas gelée et chaque Thread de traitement s'exécuteraient un après l'autre.

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Merci pour ta réponse, mais je n'arrive pas à la mettre en place.

    En fait j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void test() {
    		new Traitement().start();
     wait();
    	}
    Et j'ai la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Traitement extends Thread {
    		public void run() {
    			try {
    				sleep(10000);				
    			} catch (Exception e) {	}
    			notify();	
    		}
    	}
    J'ai essaye cela mais j'ai une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     java.lang.IllegalMonitorStateException: current thread not owner
    	at java.lang.Object.notify(Native Method)
    Je ne maitrise pas très bien cette notion et ce que j'ai trouvé sur internet ne m'a pas enormément aidé donc si tu as des explications je suis preneur...

    Merci.

  4. #4
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    au lieu d'appeler directement wait() et notify()

    Crée 2 méthodes dans ton Thread général.

    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
        public synchronized void unpause()
        {
            this.notify();
        }
     
        public synchronized void pause()
        {
            try
            {
                this.wait();
            } catch (InterruptedException ex)
            {
                ex.printStackTrace();
            }
         }
    et appelle ces méthode de tes Threads de traitement

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Alors j'ai essaye de remplacé notify et wait par ces deux méthodes dans mon code et c'est une catastrophe

    Je ne vois toujours pas le defilement de la barre de progression, et en plus, lorsque j'essaie de la supprimer, ca plante tout...

    Et si j'enlève la barre de progression ca plante après, au message de confirmation de traitement...

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    J'ai essayé d'avancer un peu mais j'y arrive toujours pas...

    J'ai trouvé une méthode

    Qui permet d'attendre un Thread, à priori, exactement ce qu'il me faut, malheureusement, ca ne fonctionne pas comme ca le devrait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Traitement t1 = new Traitement();
    		t1.start();
    		try {
    			t1.join();
    		} catch (Exception e) { }
    Ce code lance bien le Thread mais le problème c'est que dans le Thread, la barre de progression réagi comme s'il n'y avait un seul Thread de lancer (c'est à dire il ne se rafraichit pas...

    En plus lors du message de confirmation contenu à la fin de t1, l'appli se bloque complétement et on ne peut plus rien faire... (si j'enlève ce message on passe au 2 ème traitement sans problème...)

    Est-ce normal ?

  7. #7
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Citation Envoyé par RR instinct
    Ce code lance bien le Thread mais le problème c'est que dans le Thread, la barre de progression réagi comme s'il n'y avait un seul Thread de lancer (c'est à dire il ne se rafraichit pas...
    Ce n'est pas normal vu qu'un seul thread de traitement est lancé à la fois?

    Citation Envoyé par RR instinct
    En plus lors du message de confirmation contenu à la fin de t1, l'appli se bloque complétement et on ne peut plus rien faire... (si j'enlève ce message on passe au 2 ème traitement sans problème...)
    Est-ce normal ?
    Qu'entend tu par "message de confirmation" ? un JLabel, un JDialog, un affichage sur la console, ... ?

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par Lethal
    Ce n'est pas normal vu qu'un seul thread de traitement est lancé à la fois?
    Oui parfaitement, une seul Thread de traitement est lancé.

    Citation Envoyé par Lethal
    Qu'entend tu par "message de confirmation" ? un JLabel, un JDialog, un affichage sur la console, ... ?
    Le message de confirmation est un JOptionPane, si j'enleve le JOptionPane, il passe bien au fichier suivant... Seulement, le JOptionPane est "vide", en fait on ne voit que le cadre et les bouton n'apparaissent pas dedans... (un peu comme la bare de progression en fait)

    J'ai beau cherché je ne trouve vraiment pas...

  9. #9
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Si tu veux tu me filer ton code par email, je peux y jeter un oeil. (Je ne promet rien )

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    J'ai envoyé par mp.

    Merci pour ton aide en tout cas.

  11. #11
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Voila répondu.

    De rien

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Je me permet de remonter le topic car je n'ai toujours pas de solution satifaisante...

    Je résume :

    - j'ai un fonction de lecture de fichier avec insertion dans un base de données distantes, traitement, saisie utilisateur etc...
    - j'ai un programme principal qui permet de lancer le traitement de lecture d'un fichier.
    - ce traitement créé une barre de progression qui permet de suivre le déroulement.
    - pour que la progression soit visible, il faut donc créer le traitement dans un nouveau thread.

    A partir de la j'arrive à lire un fichier...

    Maintenant je veux lire plusieurs fichiers l'un après l'autre...

    Le problème c'est qu'en les lancant dans un thread différent, le thread principal enchaine et démarre tous les threads et donc on ne s'y retrouve plus dans les traitements...

    Donc y'a-t-il un moyen pour stopper le thread principal en attendant que le thread de traitement "secondaire" en cours se termine, tout en gardant, bien sur les affichages generés par le thread "secondaire" ?

    Merci.

Discussions similaires

  1. progressBar sans bordure
    Par diabli73 dans le forum C#
    Réponses: 2
    Dernier message: 20/06/2009, 10h30
  2. IPC sans Thread
    Par jproto dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 12/03/2008, 14h04
  3. [PB] Progressbar avec thread
    Par todier dans le forum C#
    Réponses: 3
    Dernier message: 15/06/2007, 10h46
  4. [Thread] [synchronised] utilisation sans thread
    Par philippe13 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 01/03/2007, 09h25
  5. [vb2005]Progressbar et thread
    Par stargates dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/06/2006, 07h38

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