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

Eclipse Platform Discussion :

Eclipse Job API


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut Eclipse Job API
    Bonjour,

    Dans le cadre de mon application RCP, j'utilise l'api Job d'Eclipse l'execution parallèle des taches. Mon problème se situe au niveau de la synchronisation des IHM à la fin d'une tache. Je me suis basé sur l'example ici sans parvenir à la synchronisation.
    La figure jointe illustre l'objectif visée.

    Merci de me donner quelque piste et/ou exemple de code.
    Images attachées Images attachées  

  2. #2
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut
    Bonjour,

    J'essaie d'avancer. ci-dessous un extrait de mon code.

    0) Un plugin de controle de dialogue avec une classe StudentControler.java

    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
     
    public class StudentControler {
     //  variable globale observée par une vue StudentViewPart.java
     private Student currentNewStudent;
     
     
    public static Student getCurrentNewStudent(){
       return currentNewStudent;
    }
     
    public static void setCurrentNewStudent(Student stud){
       // implémentation du système de notification
    }
     
     
    }


    1) Dans le pugin chargé le la gestion des IHM contient une vue StudentViewPart.java :

    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
     
    public StudentViewPart extends org.eclipse.ui.part.ViewPart{
     
    // cette tableviewer permet l'affichage des étudiants
    private TableViewer studentTableViewer;
     
    public void createPartControl(final Composite parent) {
     
       /* Code d'initilisation de studentTableViewer */
     
      //  Ecoute de la variable currentNewStudent
         newStudentListener();
    }
     
     
    public void newStudentListener(){
     
    // ....
     
    // mise à jour de la tableViewer des étudiants
          studentTableViewer.refresh();
     
    }

    2) Dans le plugin chargé du traitement long:


    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
     
    public class LongRuningAction {
     
     
    public static void start(){
     
    Display.getCurrent().asyncExec(new Runnable() {
    	public void run(){
     
    	Job job = new Job("Long job ...") {
    protected   org.eclipse.core.runtime.IStatus run(
    			IProgressMonitor monitor) {
    	monitor.beginTask("run", IProgressMonitor.UNKNOWN);
     
    	monitor.subTask("Run ...");
     
             // creation de 5 étudiants
            for (int i=0; i<5; i++){ 
            Student newStudent= new Student();
     
           // Notification de la création d'un étudiant
            StudentControler.setCurrentNewStudent(newStudent);
             }
    	monitor.subTask("Finish ...");
     
    	monitor.done();
     
     
    	return Status.OK_STATUS;
    	}
    	};
    job.setUser(true);
    job.schedule();
     
            }
           });
     
          }
     
    }
     
    }

    A l'exécution, je recois: org.eclipse.swt.SWTException: Invalid thread access
    Alors que je me disais que l'avoir contourné grâce au code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Display.getCurrent().asyncExec(new Runnable() {
    	public void run() {
         /* .... */
    }
    Quelqu'un aurait-il une solution?

    Merci

  3. #3
    iuz
    iuz est déconnecté
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 114
    Par défaut
    Bonjour,


    Il faut inverser le job et l'asynexec :
    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
     
    		Job job = new Job("Long job ...") {
    			protected org.eclipse.core.runtime.IStatus run(IProgressMonitor monitor) {
    				Display.getCurrent().asyncExec(new Runnable() {
    					public void run() {
    						monitor.beginTask("run", IProgressMonitor.UNKNOWN);
     
    						monitor.subTask("Run ...");
     
    						// creation de 5 étudiants
    						for (int i = 0; i < 5; i++) {
    							Student newStudent = new Student();
     
    							// Notification de la création d'un étudiant
    							StudentControler.setCurrentNewStudent(newStudent);
    						}
    						monitor.subTask("Finish ...");
     
    						monitor.done();
     
    					}
    				}
    				return Status.OK_STATUS;
    			}
    		};
    		job.setUser(true);
    		job.schedule();

  4. #4
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut
    Merci pour ton aide.
    ca commence à aller.

    Le nouveau problème c'est que la barre de progression ne s'affiche plus malgré la présence des lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    monitor.beginTask("Loading corpus action", IProgressMonitor.UNKNOWN);
    ...
     
    job.setUser(true);
    job.schedule();

  5. #5
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Par "la barre de progression", tu entends la boite de dialogue avec la barre de progression pour le Job ou la barre de progression dans la barre de status?
    Si tu n'as pas la boite de dialogue mais que tu as la barre de progression dans la zone de status, c'est surement que tu as sélectionné la préférence "Always run in background". Tu peux la retirer en allant dans Window > Preferences > General.
    Si tu n'as plus aucune barre de progression pour ton Job, il n'est peut-être pas assez long pour être observé. Essaye de mettre des Thread.sleep() pour voir si ça affiche les barres.

    Voilà, à+
    Gueritarish

  6. #6
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut
    Je parle de la progression du Job.
    J'ai déja fait des tests avec Thread.sleep en augmentant le temps mais ca ne fontionne pas.
    Ce qui m'étonne c'est que sans la permutation entre Job et asyncExec la progression du Job est visible. Mais maintenant non.

    par contre j'ai modifier l'obtention du Display par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PlatformUI.getWorkbench().getDisplay()
    car avec Display.getCurrent() ou getDefault() j'obtenais parfois des nullpointer

  7. #7
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut,

    Ce que tu as implémenté là, c'est le lancement d'un Job dans le Thread IHM. Ton Job, quant à lui, s'exécute tranquillement dans son Thread à lui et tente d'accéder à des ressources IHM qui ne sont bien entendu accessible que dans le Thread IHM. Donc, pour ton traitement, je te conseille plutôt de faire :
    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
    public class LongRuningAction { 
     
    	public static void start(){
    		Job job = new Job("Long job ...") {
    			protected org.eclipse.core.runtime.IStatus run(
    					IProgressMonitor monitor) {
    				monitor.beginTask("run", IProgressMonitor.UNKNOWN);
    				monitor.subTask("Run ...");
    				// creation de 5 étudiants
    				for (int i = 0; i < 5; i++) {
    					Student newStudent = new Student();
    					// Notification de la création d'un étudiant
    					Display.getCurrent().asyncExec(new Runnable() {
    						public void run() {
    							StudentControler
    									.setCurrentNewStudent(newStudent);
    						}
    					});
    				}
    				monitor.subTask("Finish ...");
    				monitor.done();
    				return Status.OK_STATUS;
    			}
    		};
    		job.setUser(true);
    		job.schedule();
    	}
    }
    Voilà, à+
    Gueritarish

    [EDIT] grilled par iuz, même si mon message est plus explicite

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/02/2012, 08h14
  2. Erreur Http 500 sous eclipse avec aPI servlet
    Par RouRa22 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 21/04/2009, 17h25
  3. [API]JTAPI non reconnu par eclipse
    Par julio84 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 15/04/2005, 14h03

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