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 :

[RCP] Treeviewer non thread-safe ?


Sujet :

Eclipse Platform

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut [RCP] Treeviewer non thread-safe ?
    Bonjour,

    Dans l'appli que je suis en train de développer sous Eclipse et utilisant RCP, j'ai besoin de faire un raffraichissement automatique du contenu d'un treeviewer contenu dans ma vue.

    Pour cela, j'ai créé une classe qui hérite de java.util.TimerTask qui me lance un thread qui effectue mon raffraichissement de manière "cadencée".

    Le probleme que je rencontre est que lorsque que met à jour les données de mon treeviewer (méthode refresh() ou setInput() ), une exception est lancée et mon thread est killé.

    Les widgets RCP ne seraient-ils pas thread-safe ? Quelqu'un a-t-il déjà réussi a faire quelque chose de similaire ? Y'aurait-il un timer (ou des threads) spécifique à RCP ?

    Je remercie d'avance toute personne pouvant m'apporter une réponse a ces questions.

  2. #2
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Après avoir quelque peu cherché, j'ai vu que le TreeViewer stocke les datas dans un CustomHashTable.

    Cette classe n'hérite pas de HashTable ... mais cette derniere n'étant pas thread safe, quelqu'un sait-il si le comportement du CustomHashTable de RCP est le même dans un environnement multi-threadé ?

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    En ayant affiché l'Exception, voici la methode fautive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    org.eclipse.swt.SWTException: Invalid thread access
    	at org.eclipse.swt.SWT.error(SWT.java:2942)
    	at org.eclipse.swt.SWT.error(SWT.java:2865)
    	at org.eclipse.swt.SWT.error(SWT.java:2836)
    	at org.eclipse.swt.widgets.Widget.error(Widget.java:395)
    	at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:298)
    	at org.eclipse.swt.widgets.Table.deselectAll(Table.java:944)
    	at org.eclipse.jface.viewers.TableViewer.setSelectionToWidget(TableViewer.java:1011)
    	at org.eclipse.jface.viewers.StructuredViewer.setSelectionToWidget(StructuredViewer.java:1496)
    	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1208)
    	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1262)
    Dans Widget.checkWidget, on trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    protected void checkWidget () {
    	Display display = this.display;
    	if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
    	if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
    	if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);
    }
    Il semblerait donc qu'aucun widget RCP ne soient thread-safe puisqu'il cherche systématiquement à redessiner le widget dans un thread qui n'est pas le thread principal ...

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    En effet un thread externe ne peut pas acceder au thread principal

    Pour solutionner :

    display.asyncExec(new Refresher());

    private class Refresher implements Runnable {
    public void run() {
    viewer.refresh();
    }
    }


    Voila, j'espere que ca aura fait avancer la chose !

    Virginie

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 103
    Points : 81
    Points
    81
    Par défaut
    Bonjour, je remonte ce message car j'ai un problème similaire.
    J'arrive à mettre à jour une fois par seconde un TableTreeViewer à partir d'un thread non-UI.
    Mais j'ai remarqué que mon programme consomme 80 ko de mémoire en plus chaque seconde. Je pense que ça vient du fait que je fais un refresh de mon TableTreeViewer.
    Y a-t-il une solution pour rafraichir un Viewer à partir d'un timer afin de relancer le LabelProvider du Viewer ?

    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 void run() {
    		while(boucle){
    			try {
    				timer.sleep(1000);
    				Display.getDefault().asyncExec(new Runnable(){
    					public void run() {
    						viewer.refresh();
    					}
    				});
    			} 
    			catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}

Discussions similaires

  1. [MultiThreading] DecimalFormat.parse non thread-safe
    Par Jidefix dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 06/05/2009, 16h17
  2. Code non thread-safe
    Par khazna dans le forum C++
    Réponses: 9
    Dernier message: 06/03/2008, 17h28
  3. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  4. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  5. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21

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