Librerie grafiche SWT : operare sui widgets da Threads secondari

3 giugno 2008

Recentemente sto lavorando ad un rcp, mi è capitato quindi di dover apportare delle modifiche in runtime sullo stato dei widgets grafici del mio prodotto.
Spesso può succedere che deleghiamo ad un thread secondario delle operazioni che richiedono un particolare tempo d’attesa,nel mio caso ad esempio il thread resta in ascolto su uno stream di un processo in esecuzione.
Avendo ricevuto un segnale,il thread ad esempio potrebbe avere la necessità di apportare una modifica ad un widgets,sempre nel mio caso una volta ricevuta una stringa dallo stream il thread vuole stamparla su un TextViewer e ritornare in ascolto per una nuova stringa.
In questo contesto è bene tenere presente però, che il thread secondario non ha un privilegio d’accesso tale da poter apportare direttamente modifiche sul display,ed è anche ragionevole tale comportamento perchè gli eventi grafici devono essere schedulati secondo un ordine ben preciso da un apposito thread,non vengono elaborati per come arrivano,a casaccio.

Le SWT ci offrono due strumenti utile per poter effettuare queste operazioni in modo pulito: i metodi
asyncExec(Runnable) e syncExec(Runnable).
I due metodi hanno come argomento un oggetto di tipo runnable,possiamo istanziarvi una classe che implementa il metodo run() con le operazioni grafiche che ci interessano.
es.

 display.asyncExec(new Runnable() {
					public void run() {	
			if(StatusLineContribution.isBuildEnabled())    		
				StatusLineContribution.setBuildEnabled(false);
				StreamView.resetStreamViewer(textDoc,streamViewer);
					}
			  });

Leggi il seguito di questo post »