segunda-feira, 12 de novembro de 2007

Multithreading com SWT

Antes de mais nada, um pequeno comentário de um usuário de Swing, em relação ao SWT:

Ô coisa complicada do demo!


Tá. Desespero de lado, vamos ao que interessa: Acessando elementos gráficos do SWT através de uma outra thread.

Vamos dizer que eu tenho um programa, que tem que monitorar o banco de dados, de 5 em 5 segundos, e colocar o valor de um campo em um Text (o equivalente SWT ao JTextField).
Primeiro, criamos o Text:


Text campoText = new Text(composite, SWT.BORDER);


Beleza. Agora, se a gente tenta acessar ele através de uma outra Thread, o maldito "Invalid Thread access" aparece, indicando que a gente tem que mudar de estratégia.

O que deve ser feito? Criar uma Thread mais ou menos assim:


final Thread t = new Thread(){
public void run(){
while(true){
Display display = shell.getDisplay();
if(display == null || display.isDisposed()) return;
display.asyncExec(new Runnable() { //Início do Runnable
public void run() {
String str = pegaCampoDaTabelaTal();
campoText.setText(str);
}
}); //Fim do Runnable
try { // Tenta dormir (FORA do Runnable)
sleep(5000); // 5 segundos
} catch (InterruptedException e) {}
} // Fim do while
} //Fim do método run
}; // Fim da Thread
t.start(); // Inicia a Thread \o/


Com o trecho de código acima, é possível acessar campoText através da Thread t, sem dor, só alegria!

Um pequeno parênteses: Existe uma diferença bem grande entre os métodos asyncExec() e syncExec().
O primeiro é executado pela segunda Thread sem que a primeira Thread (a principal) seja notificada. Já o segundo vai suspender a thread principal até que o segundo Runnable (linha 6) seja finalizada. Como no nosso caso, é mais interessante que o programa continue lépido e fagueiro.

Té mais o/

Um comentário:

Anônimo disse...

Legal meu amigo...mas será que vc não poderia me ensinar como criar um relógio digital em SWT?

valeu