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 :

Lancé un thread SwingWorker depuis un autre thread SwingWorker


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre habitué
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 154
    Points
    154
    Par défaut Lancé un thread SwingWorker depuis un autre thread SwingWorker
    Bonjour,

    Je developpe un programme style traitement de texte.
    J'ai des classes commande qui etendent SwingWorker pour gérer les événement de l'interface graphique :
    - OuvrirFichierCommande extends SwingWorker
    - EnregistrerFichierCommande extends SwingWorker

    Dans doInBackground, je fais le traitement, par exemple ouvrir le fichier et le meme en memoire. Et dans done, le raffraissement de l'interface graphique.
    Jusque là je pense que je fais celà correctement et que j'ai bien compris le principe de SwingWorker.

    J'aimerai pouvoir lancé EnregistrerFichierCommande depuis le doInBackground de OuvrirFichierCommande si le fichier en cours d'édition n'a pas été enregistré.
    Vu que je débute en thread et swingWorker je me pose une question :
    Le fait de lancer un thread SwingWorker depuis un autre dans doInBackground ne poserat-il pas problème ?
    EnregistrerFichierCommande vat-il attendre que OuvrirFichierCommande aille finit (donc la fin de done) ou continuer en parrallèle ?
    Je ne peut pas utiliser non plus invokeAndWait car celà va lancé EnregistrerFichierCommande dans l'EDT et son doInBackground aussi...

    Merci de m'éclairer.

  2. #2
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    Non, cela ne pose pas de problèmes de lancer un autre SwingWorker depuis un doInBackground.

    On ne sait pas quand va commencer la partie doInBackground de ton SwingWorker suivant, ni même quand est-ce qu'elle se terminera. Le second peut très bien se terminer avant le premier, et donc le second done être lancé avant le premier.

    La seule chose que l'on sache est que les done seront exécutés successivement, dans le EDT, mais on ne sait pas dans quel ordre.

  3. #3
    Membre habitué
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 154
    Points
    154
    Par défaut
    Ok, donc sa va posé problème car il faut que le fichier soit enregistrer complètement avant qu'il ne commence à ouvrir l'autre...

    Comment je peut attendre la fin de l'enregistrement avant de continuer ?
    J'avais pensé à invokeAndWait, celà sert bien a lance un thread et attendre sa fin pour continuer ?
    Mais si je l'utilise, cela va lancé le doInBackground de mon 2eme SwingWorker dans l'EDT non ?

  4. #4
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    Tu peux profiter de ce que le SwingWorker soit un Runnable et un Future pour utiliser un Executors, par exemple le newSingleThreadExecutor.

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par gifffftane Voir le message
    On ne sait pas quand va commencer la partie doInBackground de ton SwingWorker suivant, ni même quand est-ce qu'elle se terminera. Le second peut très bien se terminer avant le premier, et donc le second done être lancé avant le premier.
    En effet par défaut les SwingWorker utilisent un pool de 10 threads max. Tu peux donc avoir 10 tâches en parallèle (si tu en ajoutes d'autres elles seront mises en attente).

    Citation Envoyé par romuluslepunk Voir le message
    Comment je peut attendre la fin de l'enregistrement avant de continuer ?
    Ce que tu décris ici ne correspond pas à deux tâches parallèles mais à deux actions séquentielles fortement lié. Pourquoi utiliser 2 thread si le premier devra attendre la fin du second ???
    Tu dois faire les 2 dans le même thread, et donc dans le même SwingWorker :
    1. Tu enregistres le fichier courant
    2. Tu ouvres le nouveau fichier


    Citation Envoyé par romuluslepunk Voir le message
    J'avais pensé à invokeAndWait, celà sert bien a lance un thread et attendre sa fin pour continuer ?
    Non invokeAndWait() permet de faire un traitement dans le thread graphique (comme par exemple récupérer l'état d'un composant). Il ne faut donc surtout pas l'utiliser pour des traitements lourds...

    a++

  6. #6
    Membre habitué
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ce que tu décris ici ne correspond pas à deux tâches parallèles mais à deux actions séquentielles fortement lié. Pourquoi utiliser 2 thread si le premier devra attendre la fin du second ???
    Tu dois faire les 2 dans le même thread, et donc dans le même SwingWorker :
    1. Tu enregistres le fichier courant
    2. Tu ouvres le nouveau fichier
    C'est ce que j'ai finit par faire.
    J'ai regroupe les commandes qui sont lié dans le même SwingWorker, voici +- à quoi sa ressemble :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public class Executeur extends SwingWorker<Boolean, Boolean>
    	{
    	private String action = null;
     
    	private Executeur(String action)
    		{
    		this.action = action;
    		}
     
    	@Override
    	protected Boolean doInBackground() throws Exception
    		{
    		// si l'utilisateur demande à ouvrir un fichier
    		if (this.action.equals("ouvrir"))
    			return this.ouvrirFichier();	
     
    		// si l'utilisateur demande a enregistrer le fichier
    		else if (this.action.equals("enregistrer"))
    			return this.enregistrerFichier();
     
    		return false;
    		}
     
    	protected void done()
    		{
    		// si l'utilisateur demande à ouvrir un fichier
    		if (this.action.equals("ouvrir"))
    			this.ouvrirFichierDone();	
     
    		// si l'utilisateur demande a enregistrer le fichier
    		else if (this.action.equals("enregistrer"))
    			this.enregistrerFichierDone();
    		}
     
    	private boolean ouvrirFichier() throws Exception
    		{
    		return true;
    		}
     
    	private void ouvrirFichierDone()
    		{
     
    		}
     
    	private boolean enregistrerFichier() throws Exception
    		{
    		return true;
    		}
     
    	private void enregistrerFichierDone()
    		{
     
    		}
    	}
    De cette manière ouvrirFichier peut appelé enregistrerFichier en cas de besoin et je suis sur qu'il attendra la fin du traitement pour continuer.
    Mes méthode retourne true si l'action à été effectué, false si l'utilisateur à annulé donc je peut facilement voir si il à annulé l'enregistrement et donc annulé aussi l'ouverture. En cas d'erreur, c'est stoppé grace à throw...
    Les commandes qui n'ont aucune interaction avec d'autre commande on leur propre SwingWorker.
    Je pense avoir trouvé une bonne conception.


    Je vais tout de même regarder aux executor, même si je l'utilise pas cette fois, celà me servira certainement à l'avenir.

    Merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/08/2012, 19h51
  2. Threads. Peut-on appeler la méthode d'un thread depuis un autre thread ?
    Par Pierre8r dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 05/12/2008, 11h48
  3. CreateMDIWindow depuis un autre thread
    Par DjiZ dans le forum Windows
    Réponses: 2
    Dernier message: 03/12/2008, 10h01
  4. Réponses: 3
    Dernier message: 19/03/2008, 09h38
  5. [VB.NET/2.0] Comment MAJ ListBox depuis un autre Thread ?
    Par ShaVo dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/02/2006, 13h48

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