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 :

Deux SwingWorker a la suite


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut Deux SwingWorker a la suite
    Hello,

    Voilà je souhaite lancer deux swing worker à la suite... J'ai une fenêtre associée qui fait état de la progression de ces deux workers et qui affiche un certain nombre de messages de log via. des propertyChangeListener.

    Mon problème est que le deuxième worker doit attendre le premier avant de commencer. J'ai donc utilisé la méthode get() mais celle ci semble être bloquante au niveaux de l'interface, et du coup ma fenêtre de progression et de log n'est affichée qu'à la fin du premier worker.

    Quelqu'un sait-il si il y a un moyen de faire ce que je souhaite sans bloquer la fenêtre?

    Je pense créer un autre SwingWorker englobant ces deux derniers mais ca fait toujours du code en plus alors que ca n'est pas nécessaire dans l'absolu (et dans l'hypothèse ou c'est faisable autrement).

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 42
    Par défaut
    Bonjour,

    J'ai été confronté au même problème. En fait, le plus simple est d'utiliser des Executor ou ExecutorService (selon si tu as besoin de récupérer un résultat ou pas). Plus précisément, pour que tes workers soient exécutés successivement, il faut que tu récupères un ThreadPoolExecutor fixe dont la capacité est de 1. Un thread pool s'occupe de créer des threads au besoin, selon les Runnable qu'on lui soumet. Si tu obtiens un thread pool de capacité X, tu pourras soumettre autant de Runnable que tu veux (donc des SwingWorker aussi), mais seuls X d'entre eux seront exécutés en même temps, les autres seront mis en attente jusqu'à ce qu'un thread du pool se libère. Donc, si tu donnes une capacité de 1, tu obtiens une file de Runnable.

    Pour obtenir un ThreadPoolExecutor de capacité 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ExecutorService threadPool = Executors.newFixedThreadPool(1);
    Mais comme ils sont gentils chez Sun, ils ont ajouté cette méthode qui simplifie la vie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ExecutorService threadPool = Executors.newSingleThreadExecutor();
    J'ignore si tu reçois exactement le même type objet (sûrement pas), mais le résultat sera le même.

    Ensuite, tu soumets (dans l'ordre, bien sûr) tes workers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    threadPool.submit(monWorker);
    Et à la fin, il est bon de clôturer le thread pool :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    threadPool.shutdown();
    Je t'encourage à bien regarder la JavaDoc sur tout ça, il y a plein de méthodes qui permettent de gérer plus finement si besoin.

    Alors par contre, une chose importante quand tu utilises tout ça : tu peux utiliser sans problème la méthode done() de SwingWorker (elle est exécutée dans l'EDT, qui gère une file d'appels), mais n'oublie pas que le deuxième worker va démarrer JUSTE AVANT l'exécution de done() du premier, et c'est bien normal vu que pour le thread pool, le Runnable est terminé. Et surtout, autre problème, tu ne peux pas gérer le cas où l'exécution du deuxième worker serait conditionnelle au résultat du premier (en particulier si la condition impose une interaction avec l'utilisateur).

    Dans ces cas-là, personnellement je n'ai pas encore trouvé mieux que faire démarrer le deuxième worker dans le done() du premier. Dans les cas très simples, ça va, mais c'est quand même super moche.

    Voilà, en espérant t'avoir aidé .

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Oui merci ca semble fonctionner comme je souhaite. Le problèmle est en effet que je doit intéragir avec l'utilisateur dans le cas ou mon premier worker aurait rencontré des problèmes...

    C'est sur que ta solution est pas très élégante car elle suppose d'intéragir avec l'utilisateur au sein du worker (dans le done) si j'ai bien compris. Humm en même temps je ne vois pas d'autres solutions pour le coup...

    Bon je vais y réfléchir, en tout cas merci pour ton aide précieuse

Discussions similaires

  1. deux animation a la suite
    Par clod83 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 23/10/2009, 18h39
  2. Réponses: 1
    Dernier message: 13/09/2009, 23h22
  3. Afficher les enregistrements de deux tables a la suite
    Par Bib1dum dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/01/2009, 23h02
  4. [etat] deux états à la suite
    Par celiaaa dans le forum IHM
    Réponses: 1
    Dernier message: 08/12/2006, 14h58
  5. [MySQL] impossible d'executer mes deux updates a la suite
    Par budylove dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/05/2006, 14h49

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