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 :

[Thread] Fenêtre d'attente


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 19
    Par défaut [Thread] Fenêtre d'attente
    Salut à tous,

    Je vous explique le contexte.
    J'ai une application qui exploite des fichiers binaire contenant de nombreuses données. Les fichiers peuvent être assez gros et l'ouverture peut demander du temps (jusqu'à une minute mais cela pourrait être plus long).

    L'ouverture d'un fichier est découpée en morceau, lecture, statistiques, etc...
    Les étapes se suivent et sont indissociables.
    Tout se fait automatiquement.

    L'étape la plus longue et la lecture du fichier. C'est pour cette étape que je voudrais mettre une fenêtre d'attente.

    J'ai tenté de mettre en application le bon exemple de la FAQ sur les fenêtres d'attente mais sans succès.

    Alors j'ai crée une classe héritant d'une JDialog et recevant en argument un objet de type JAbstractTask qui est en gros un Thread.

    Le dialog s'initialise bien et lance le Thread mais ma fenêtre n'apparait que lorsque le Thread est fini donc retour à la cas départ !

    Comment faire pour que mon interface vive et qu'en même temps la tache d'ouverture soit bloquante !

    Merci pour vos conseil.
    A+

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    une piste:la classe SwingUtilities et sa méthode
    invokeAndWait(Runnable r) qui arrête le thread principal et force le dessin.
    Si ça peut t'aider...

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Membre éclairé Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Par défaut
    SwingUtilities est la solution.
    J'avais le meme probleme aujourd'hui résolu
    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
     
    new Thread(new Runnable() {
                        public void run() {
     
                            final FenetreInstant t = new FenetreInstant("Extraction en cours...") ;
     
                            //On modifie l'état  d'un composant Swing => Opération à effectuer dans l'EDT
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                    t.setVisible(true);
                                }
                            });
     
                            //ta tache de fond n'a rien a voir avec l'EDT
                            tache_de_fond();
     
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                    t.dispose();
                                }
                            });
     
     
                        }
                    }).start() ;
    la fenetre t représente ta fenetre pour faire patienter...il faut l'initialiser avec setVisible(false).
    Si ca peux t'aider....
    Bon courage!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 19
    Par défaut
    Salut,

    Merci pour vos réponse.

    une piste:la classe SwingUtilities et sa méthode
    invokeAndWait(Runnable r) qui arrête le thread principal et force le dessin.
    Si ça peut t'aider...
    Tenté mais j'ai un beau :
    Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread

    Voilà trois tutoriels qui me semblent pouvoir t'apporter une solution
    Je vais regarder car visiblement certaines choses m'échappent !!!

    rems033, merci pour ton code, je vais essayer mais je voulais faire quelque chose de très réutilisable et modifiant le moins possible mon code existant.

    Une question quand même, pourquoi n'y a t'il pas de méthode générique ? est-ce un manque du langage ou est-ce trop dure de faire du code réutilisable ?
    A+

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Citation Envoyé par carlierd
    Une question quand même, pourquoi n'y a t'il pas de méthode générique ? est-ce un manque du langage ou est-ce trop dure de faire du code réutilisable ?
    A+
    C'est à dire que rien ne stipule à l'avance le temps que va prendre ton traitement.

    Pour qu'une GUI soit réactive il faut mettre les traitements longs dans un thread à part, de façon à libérer le plus rapidement possible l'interface utilisateur.

    Comme cette opération peut avoir des conséquences lourdes, c'est au programmeur d'apprécier si elle est adéquate, et quelle est la meilleure façon de la mettre en oeuvre. (pour qu'elle n'ait pas de conséquences lourdes, évidemment).

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Citation Envoyé par carlierd
    :
    Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
    en faite danq une appli tu as le thread principal qui demarre avec la methode main et le event dispatcher thread(EDT) qui modifie les composant swing qui démmarre en parralelle. La methode invokeAndWait demande au EDT de faire une modification de l'interface. Mais surtout demande de le faire en bloquant le main thread jusqu'a que l'EDT est fini sa tache.
    Fait voir comment tu la utilisé je pens qu'il y a un problème, tu n'est pas dans le bon thread

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

Discussions similaires

  1. [Multi-Thread] Mettre un msg d'attente lors d'un traitement long
    Par pepito62 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 29/03/2013, 20h43
  2. MVVM: Erreur thread appelant doit être en mode STA
    Par Oberown dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 05/12/2010, 15h20
  3. [Thread] Travail en parallèle et attente
    Par Jabbal'H dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 13/10/2008, 16h28
  4. Réponses: 1
    Dernier message: 02/06/2008, 18h35
  5. [MFC] Creation d'un thread pour un popup d'attente
    Par firejocker dans le forum MFC
    Réponses: 8
    Dernier message: 07/02/2006, 09h15

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