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 :

[EDT] Blocage impression


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut [EDT] Blocage impression
    Salut !

    Je rencontre un petit problème lors de tentative d'impression en Java, et je me posais une question sur l'EDT.

    J'ai créé un bouton "Imprimer" et lorsque j'appuie sur celui-ci, je lance une méthode dans l'ActionListener associé au bouton.
    Je me crées alors un PrinterJob, tout ça tout ça, et j'ai mis l'appel aux méthodes printJob.setPrintable() et printJob.print() dans un Thread.

    Sauf que souci, j'ai parfois ce qui ressemble à un interblocage : l'appli tourne en rond, IHM grise, plus de réponse.

    Est-ce dû au fait que j'appelle printJob.print() dans un Thread lui-même dans l'EDT ?

    Petit bout de code :
    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
     
       printMenuItem.addActionListener( new ActionListener(){
          public void actionPerformed(ActionEvent ae){
             bPrint_actionPerformed(ae);
          }
       });
     
     
       public void bPrint_actionPerformed(ActionEvent ae){
          [...]
          final PrinterJob printJob = PrinterJob.getPrinterJob();
          printJob.setJobName(srcFrame.getTitle());
          boolean b = printJob.printDialog();
          if (b) {
             PageFormat defaultFormat = printJob.defaultPage();
             final PageFormat pf = printJob.pageDialog(defaultFormat);
     
             // test permettant de savoir si l'utilisateur a appuyé sur le bouton "Annuler"
             if (!pf.equals(defaultFormat)){
                [...]
                progressBar = MyProgressBar.getInstance();					
                progressBar.show(true);
                [...]
     
                Thread runner = new Thread(){
                   public void run(){
                   printJob.setPrintable(myApp, pf);
     
                   try {
                      System.out.println("***** Début print() *****");
                      printJob.print();
                   } catch (Exception ex) {
                      ex.printStackTrace();
                   }
     
                   setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                   progressBar.dispose();
     
                   System.out.println("***** Fin print() *****");
                }
             };
     
             runner.start();
          }
       }
    }
    J'ai bien "***** Début print() *****" qui s'affiche, mais après, blackout, ça bouge plus...

    Merci d'avance pour tout éclaircissement...

  2. #2
    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
    Non, cela ne vient certainement pas de ce que tu lances un thread depuis l'EDT.

    Par contre, peut être qu'il faudrait remettre, à mon avis, les appels à setCursor et à dispose dans l'EDT. Mais il peut y avoir tant d'autres raisons, je dis ça juste pour la bonne pratique.

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Le seul problème, c'est que pour les remettre dans l'EDT, il faut que je fasse un SwingUtilities.invokeLater() dans le thread (lui-même étant dans l'EDT).

    Je ne vais pas avoir un blocage là-dedans ? L'EDT qui lance un thread qui lance un évènement devant se passer dans l'EDT quand celui-ci sera dispo. Mais comme le Thread tourne toujours, l'EDT est occupé et donc le invokeLater() ne peut pas être lancé, et donc l'EDT tourne en boucle sans rien faire ?
    J'ai l'impression de voir des blocages partout, je crois que je deviens fou

  4. #4
    Membre éclairé Avatar de puybaret
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 61
    Par défaut
    Le thread d'impression que tu lances n'est pas dans l'EDT, puisque c'est un autre thread.
    EDT ça veut dire Event Dispatch Thread, et c'est donc un seul thread pas un groupe de thread.
    Tu peux donc appeler invokeLater sans problème pour mettre à jour ton curseur dans l'EDT à partir de ton thread.

    Par contre, je ne sais pas si tu as le droit de lancer l'impression dans un thread différent de l'EDT. Il me semble que non, mais je n'arrive plus à retrouver l'info le confirmant.

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Le thread d'impression que tu lances n'est pas dans l'EDT, puisque c'est un autre thread.
    Ben disons que la méthode dans laquelle je crée ce thread d'impression est appelée lors d'un ActionListener. Or il me semble que tout ce qui est listener est traité dans l'EDT...

  6. #6
    Membre éclairé Avatar de puybaret
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 61
    Par défaut
    Ta méthode bPrint_actionPerformed est bien exécutée dans l'EDT, mais dans cette méthode tu crées bien un autre thread dans lequel tu lances l'impression. Donc, l'appel à print ne s'effectue pas dans l'EDT.

Discussions similaires

  1. [PPT-2007] Problème impression - blocage
    Par vivi21 dans le forum Powerpoint
    Réponses: 0
    Dernier message: 16/11/2010, 11h34
  2. Impression : EDT ou thread séparé ?
    Par kwxyz dans le forum EDT/SwingWorker
    Réponses: 2
    Dernier message: 05/07/2010, 15h25
  3. blocage pour l'impression
    Par flo456 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 03/05/2007, 17h28
  4. Blocage de l'EDT lors du click sur un bouton
    Par bassim dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 13/12/2006, 23h44
  5. probleme de blocage d'impression :(
    Par softstar dans le forum Delphi
    Réponses: 5
    Dernier message: 16/09/2006, 11h25

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