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

SWT/JFace Java Discussion :

Bouton et action


Sujet :

SWT/JFace Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 91
    Points : 114
    Points
    114
    Par défaut Bouton et action
    Bonjour,

    Je suis en train de développer une vue qui comprend un bouton déclenchant un traitement. Ce traitement doit libérer l'interface et ne pas la bloquer, or, même en utilisant un déclenchement asynchrone, mon IHM est bloquée par ce traitement.

    Voici comment est construit mon bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    okButton = new Button(parent, SWT.PUSH)
    [........]
    okButtont.addSelectionListener(new SelectionListener(){
     public void widgetSelected(SelectionEvent event){
      parent.getDisplay().asyncExec(new Runnable(){
       public void run(){
         // mon code qui bloque l'ihm
       }
      }
     });
    Comme les Action avec les menu fonctionnent bien et ne bloquent pas l'IHM, je me suis dit qu'il serait peut être souhaitable de passer par une Action, par contre je ne sais pas comment "binder" l'action avec les événements du bouton.

    Comme j'ai du mal à trouver l'information, il est probable que je fasse fausse route => n'hésitez pas à me réaiguillier

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Si ton traitement est un peu long, il va effectivement bloquer l'interface pendant son exécution, quel que soit le mode de déclenchement.
    En fait le blocage se fait dès lors que le traitement est lancé à partir du thread dédié à l'IHM (le Display).

    Pour les traitements longs, la bonne approche consiste à utiliser les jobs.
    Pour cela il faut surcharger la classe WorkspaceJob et implémenter la méthode runInWorkspace qui va être exécuter dans un thread à part, géré par le workspace. C'est comme ca notamment que Eclipse gère les compilations en background.

    Une fois la classe d'exécution implémentée, le job est lancé de la manière suivante :
    - Création d'une instance du job.
    - Association d'une règle de scheduling.
    - Lancement.

    Un exemple issu d'un de mes dév :

    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
     
    static class CopyrightJob extends WorkspaceJob {
        CopyrightSettings settings;
     
        public CopyrightJob(CopyrightSettings settings) {
          super(Messages.CopyrightManager_jobName);
          this.settings = settings;
        }
     
        @Override
        public IStatus runInWorkspace(IProgressMonitor monitor) {
          try {
            return applyCopyright(settings, monitor);
          } catch (CopyrightException e) {
            return new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
          }
        }
      }
    [...]
    Job job = new CopyrightJob(settings);
    job.setRule(ResourcesPlugin.getWorkspace().getRoot());
    job.schedule();
    En fait l'appel de la méthode schedule va ajouter le job dans la file des jobs en attente d'exécution. Il sera réellement exécuté lorsqu'il arrivera en tête de la file, suivant la règle de scheduling définie.

    La doc Eclipse est assez explicite sur le sujet.

    Eric

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 91
    Points : 114
    Points
    114
    Par défaut
    J'imagine qu'il s'agit des tâches que l'ont voit s'empiler dans la vue "Progress", non?

    Merci pour le snippet je vais tester, je me suis pour le moment débloqué en lançant un thread java dans mon bundle métier, ce que RCP m'autorise puisqu'il n'a aucune dépendance avec l'IHM.

    Brice

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Effectivement, la vue Progress permet de suivre l'avancement des jobs.
    L'avantage des jobs par rapport à un simple thread est qu'ils permettent de gérer des règles de scheduling et de concurrence d'accès sur des ressources du workspace.
    Si ton traitement ne manipule pas de ressources Eclipse (par ex. IProject ou IFile), alors un simple thread devrait faire l'affaire.

    Un autre avantage des jobs est qu'ils sont associés à un objet Monitor qui permet d'en suivre l'avancement, et au besoin de les interrompre (le bouton rouge dans la vue Progress).

    Eric

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 91
    Points : 114
    Points
    114
    Par défaut
    Arrête moi si je me trompe:
    Les jobs semblent ne pas pouvoir s'exécuter de façon concurrente, non? Il semble qu'ils soient gérés sous forme de file d'attente?

    Si c'est ainsi, je vais rester sur le thread java car il est dans la couche métier pure et ne manipule aucune entité RCP, d'autant que le cas d'utilisation ne supporterait pas de se retrouver à attendre la fin d'un job pour être exécuté.

    ++

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    En fait oui et non.
    Ils ne peuvent s'exécuter de façon concurrente sur une même ressource.
    D'où la définition de règles de scheduling associées à chaque job.

    Dans l'exemple que j'ai donné, la ressource indiquée dans la règle est la racine du workspace. Donc effectivement dans ce cas, tous les jobs ayant ce niveau de synchro s'exécutent en séquence.
    Il doit être possible de définir des règles plus fines. Je ne l'ai pas fait car j'avais réellement un besoin d'exécuter le job sur l'ensemble des ressources du workspace.
    Je t'invite à regarder la doc pour plus de précision sur la définition des règles.

    Eric

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 91
    Points : 114
    Points
    114
    Par défaut
    Je m'y plonge merci!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/04/2009, 17h55
  2. Réponses: 9
    Dernier message: 18/05/2007, 20h40
  3. [Debutant][Bouton Radio]action avant un clic
    Par jazer dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/10/2006, 14h18
  4. [VBA][Debutant] bouton d'action
    Par stolx_10 dans le forum Access
    Réponses: 17
    Dernier message: 18/09/2006, 13h37
  5. Envoie d'un fichier excel par mail via un bouton d'action
    Par ghostal dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/07/2006, 08h22

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