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 :

Refresh d'un tableviewer


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Par défaut Refresh d'un tableviewer
    Bonjour,

    Je fais face depuis quelques temps à un problème de rafraîchissement d'un tableau avec un tableviewer. L'idée est la suivante : j'ai un thread séparé que reçoit des données depuis le réseau et qui doit les traiter puis les afficher dans mon tableau, j'ai donc utilisé le pattern Observable/Observer et à chaque fois qu'une nouvelle donnée est reçue, le thread de l'UI est notifié et je demande un rafraîchissement du tableau.

    Mon problème est que le rafraîchissement du tableau demande un certains temps (chaque ligne a une couleur de fond, une couleur de police ... en fonction de son contenu) donc si je fais un syncExec() l'affichage est trop lent comparé à la vitesse à laquelle mes données arrivent et je ne veux pas perdre des données parce que le tableau n'a pas été mis à jour à temps.

    J'ai donc essayé de faire un asyncExec() mais mon problème est que les demandes de rafraîchissement s'accumulent alors que je n'ai besoin d'en faire une seule. Par exemple si je reçois 10 données avant que le thread UI n'ait l'occasion de mettre à jour le tableau, je ne veux pas mettre à jour mon tableau 10 fois. Vu que je modifie le même modèle une seule fois suffirait.

    J'ai essayé d'utiliser Display.readAndDispatch() sans avoir de bons résultats (et sans vraiment comprendre comment ça marche à vrai dire). J'ai aussi essayé de mettre des locks autour des mes appels à asyncExec() pour garantir que si j'ai déjà une demande de refresh() en attente, une nouvelle ne vienne pas s'ajouter mais parfois (je n'arrive pas à voir pourquoi) le lock n'est pas libéré et plus rien n'est mis à jour...

    Bref j'ai l'impression de passer à côté de quelque chose... Si vous aviez des idées pour m'aider

    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
     
    public void update(Observable arg0, Object arg1) {
    	//if(!lock) {
    		//lock = true;
    			display.asyncExec(	new Runnable() {
    			    public void run(){
    				    	if(!display.readAndDispatch())
    			    		if(!table.isDisposed())	{
    				       		viewer.refresh(false);
    		    			//lock = false;
    				    	}
    				    }
    				  });
    		//}
    	}
    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Par défaut
    Après de plus amples recherches, il s'avère que le "lock" n'est pas libéré à cause d'une exception qui est levée lors du refresh du tableau. Cette exception n'est levée que lorsque je réduis la fenêtre dans la barre des tâches Windows (tant qu'on "voit" la fenêtre, je n'ai aucun problème...)


    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
    org.eclipse.core.runtime.AssertionFailedException: null argument:
    	at org.eclipse.core.runtime.Assert.isNotNull(Assert.java:85)
    	at org.eclipse.core.runtime.Assert.isNotNull(Assert.java:73)
    	at org.eclipse.jface.viewers.StructuredViewer.assertElementsNotNull(StructuredViewer.java:595)
    	at org.eclipse.jface.viewers.StructuredViewer.getRawChildren(StructuredViewer.java:960)
    	at org.eclipse.jface.viewers.ColumnViewer.getRawChildren(ColumnViewer.java:703)
    	at org.eclipse.jface.viewers.AbstractTableViewer.getRawChildren(AbstractTableViewer.java:1087)
    	at org.eclipse.jface.viewers.StructuredViewer.getFilteredChildren(StructuredViewer.java:893)
    	at org.eclipse.jface.viewers.StructuredViewer.getSortedChildren(StructuredViewer.java:1016)
    	at org.eclipse.jface.viewers.AbstractTableViewer.internalVirtualRefreshAll(AbstractTableViewer.java:676)
    	at org.eclipse.jface.viewers.AbstractTableViewer.internalRefresh(AbstractTableViewer.java:651)
    	at org.eclipse.jface.viewers.StructuredViewer$8.run(StructuredViewer.java:1484)
    	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1392)
    	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1353)
    	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1482)
    	at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:548)
    	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1439)
    	at rcpPlugin.TabPrinc$18.run(TabPrinc.java:682)
    	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
    	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3855)
    	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3476)
    	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
    	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
    	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
    	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
    	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
    	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    	at rcpPlugin.Application.start(Application.java:20)
    	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
    	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
    	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
    	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
    	at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
    	at org.eclipse.equinox.launcher.Main.main(Main.java:1287)
    D'après ce que je comprends de tout ça, j'essaye de mettre un objet null (ou du moins ayant au moins un paramètre null) dans mon tableau ? Ce qui me paraît bizarre c'est qu'à priori je ne le fais pas ^^ et qu'en plus je n'ai cette erreur que lorsque la fenêtre est réduite alors que j'envoie les mêmes données que quand elle est ouverte...

    Bon si je catch l'exception ça ne me bloque plus et le problème est réglé, mais je me demande quand même d'où ça vient...

    Et ce qui "m'inquiète" aussi c'est cette ligne :
    at rcpPlugin.TabPrinc$18.run(TabPrinc.java:682)
    => $18 ça veut dire quoi exactement ? Que c'est la 18e fois que je fais un asyncExec() ?

Discussions similaires

  1. [JTabbedPane]Refresh spécifique
    Par Piolet dans le forum Composants
    Réponses: 3
    Dernier message: 11/06/2004, 19h11
  2. Refresh
    Par bluevelvet dans le forum Bases de données
    Réponses: 3
    Dernier message: 01/04/2004, 13h20
  3. Probleme de Refresh avec TQuery et DBGrid
    Par insoo dans le forum C++Builder
    Réponses: 7
    Dernier message: 25/11/2003, 17h20
  4. Réponses: 2
    Dernier message: 23/12/2002, 20h34
  5. Sortir d'un progamme qui boucle ou qui refresh
    Par mikevador02 dans le forum C
    Réponses: 12
    Dernier message: 14/12/2002, 09h38

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