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