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 :

WizardPage JFace qui freeze


Sujet :

SWT/JFace Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut WizardPage JFace qui freeze
    Bonjour,

    Nouveau en Java & en jFace, j'ai une fenêtre qui se gèle sur un traitement long. Après recherche sur internet, j'ai testé des tas de solutions sans succès. Je suis dessus depuis 24H, et ça commence à être pénible.

    Plus précisément, j'ai une WizardPage jFace avec un Button et une ProgressBar.
    Lorsque le Button est cliqué, il déclenche un traitement long effectué dans un thread annexe.
    Le gestionnaire d'événement de ce Button instancie le Thread et le start() dans la foulée.
    Ce Thread déclenche des événements écoutés par la WizardPage pour l'informer de la progression du traitement.
    Celle-ci met alors à jour la ProgressBar dans le gestionnaire associé. Tout fonctionne sauf que la fenêtre ne répond quasiment pas et si j'arrive à la déplacer, la ProgressBar ne se met plus à jour. Bref, soit la ProgressBar se met à jour, soit je peux bouger la fenêtre mais pas les deux

    Une idée ? la suite plus bas.

    Ça marche pas. J'ai notamment la section suivante dont les résultats me semblent étranges.

    Dans ce qui suit le "AVANT" est affiché, pas le après !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.out.println("AVANT");
    myThreadTest.start();
    System.out.println("APRES");
    Voici le code :

    ### Mon StepEvent ###
    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
    import java.util.EventObject;
     
    public class StepEvent extends EventObject
    {
    	public int step; 
     
    	public StepEvent(int iStep)
    	{
    		super(iStep);
    		this.setStep(iStep);
    	}
     
    	public int getStep()
    	{
    		return this.step;
    	}
     
    	private void setStep(int iStep)
    	{
    		this.step = iStep;
    	}
    }
    ### Mon StepEventListener ###
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import java.util.EventObject;
     
    public interface StepEventListener
    {
    	public void handleStepEvent(EventObject e);
    }
    ### Ma WizardPage ###
    ### Mon handler pour le Button Clic ###
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void handleEvent(Event iEvent)
    {
    	ThreadTest myThreadTest = new ThreadTest();
    	myThreadTest.addStepEventListener(this);
    	...
    	System.out.println("AVANT");
    	myThreadTest.start();
    	System.out.println("APRES");
    	...
    }
    ### Mon handler pour le StepEvent ###
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void handleStepEvent(EventObject e)
    {
    	pbProcess.setSelection(((StepEvent) e).getStep());
    }
    ### Mon THREAD ###
    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
    private ArrayList<StepEventListener>	stepEventlisteners	= new ArrayList<StepEventListener>();
     
    public synchronized void addStepEventListener(StepEventListener iStepEventListener)
    {
    	this.stepEventlisteners.add(iStepEventListener);
    }
     
    public synchronized void removeStepEventListener(StepEventListener iStepEventListener)
    {
    	this.stepEventlisteners.remove(iStepEventListener);
    }
     
    private synchronized void sendStepEvent(int iStep)
    {
    	for (StepEventListener myStepEventListener : this.stepEventlisteners)
    	{
    		myStepEventListener.handleStepEvent(new StepEvent(iStep));
    	}
    }
    ### Mon myThreadTest.start() ###
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (...)
    {
    	...
    	this.sendStepEvent(myPercent);
    	...
    }
    Merci d'avance pour vos conseils / liens.

  2. #2
    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 : 39
    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
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    C'est parce que tu n'utilises pas la bonne méthode.
    Un wizard contient déjà une barre de progression ainsi que méthodes particulières pour lancer un traitement long et afficher sa progression.
    Il faut, tout d'abord que tu appelles la méthode setNeedsProgressMonitor(true); sur ton Wizard (attention, c'est une méthode de Wizard qui n'est pas présente dans IWizard).
    Ensuite, pour lancer un traitement long, il te faut passer par le IWizardContainer de ton Wizard:
    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
    try {
      iWizard.getContainer().run(true, true, new IRunnableWithProgress() {
     
        @Override
        public void run(IProgressMonitor aMonitor) throws InvocationTargetException,
            InterruptedException {
          // Traitement à effectuer.
          // Le traitement commence et a comme nom "My long task".
          aMonitor.beginTask("My long task", 100);
          ...
          // 10% du traitement sont fait.
          aMonitor.worked(10);
          ...
          // Le traitement est fini, on informe le ProgressMonitor.
          aMonitor.done();
        }
      });
    } catch (InvocationTargetException iException) {
      iException.printStackTrace();
    } catch (InterruptedException iException) {
      iException.printStackTrace();
    }
    Tu as toutes les explications nécessaires dans cette page de la FAQ Eclipse.
    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Merci & autre solution !
    Merci pour ta réponse, je vais tester ça sous peu.
    J'ai réussi à bricoler une autre solution, en faisant la petite modification suivante :
    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
     
    @Override
    public void handleStepEvent(EventObject e)
    {
    	final int myCount = ((StepEvent) e).getStep();
     
    	Display.getDefault().asyncExec(new Runnable()
    	{
    		public void run()
    		{
    			...
    			pbProcess.setSelection(myCount);
    			...
    		}
    	});
    }
    Tout fonctionne, mais je ne sais pas réellement ce que ça vaut.
    Si tu peux me faire un court commentaire, je t'en serais très reconnaissant.

    RC

  4. #4
    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 : 39
    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
    Points : 3 919
    Points
    3 919
    Par défaut
    Ça va fonctionner, en effet, puisque tu exécutes ton traitement de mise à jour dans le thread IHM. Ce qu'il faut faire. Mais tu te prives de ce que t'offres le framework Eclipse.
    Selon moi, il vaut mieux que tu testes la solution que je t'ai proposé. Non pas parce que je te l'ai indiqué (je ne suis pas aussi présomptueux), mais parce qu'elle colle plus à l'API définit par Eclipse.
    Autant prendre de bonnes habitudes dès le début

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bien reçu, merci.

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/04/2007, 16h32
  2. Portable qui Freeze pendant 5 sec puis ok!
    Par pony dans le forum Ordinateurs
    Réponses: 19
    Dernier message: 03/03/2007, 23h52
  3. Disque dur qui freeze le système
    Par Celelibi dans le forum Composants
    Réponses: 4
    Dernier message: 22/02/2007, 15h16
  4. fenetre d'une appli openGl-MFC qui freeze !
    Par jcloupgarou dans le forum Développement 2D, 3D et Jeux
    Réponses: 12
    Dernier message: 28/07/2006, 12h19
  5. [wxPython][ProgressDialog] Appel de l'appli qui freeze
    Par Guigui_ dans le forum wxPython
    Réponses: 1
    Dernier message: 08/12/2005, 19h25

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