Thread no swt

29 respostas
aloha

alguem sabe como fazer uma thread no swt que altere campos da tela?
obs: esta thread tem um while(true) dentro…

valew

29 Respostas

brlima

Dio Mio!!!

Isso não tá mto claro… como assim alterar campos da tela???

aloha

exemplo:

sem contar a thread principal (MAIN)… tenho outra thread que fica escutando um canal de comunicação, c eu receber algo neste canal, tenho q alterar um textField q esta na classe que chamou esta thread (minha tela, ou shell)…

obs: esta thread tem um while(true) dentro… isso quer dizer que no metodo run() eu tenho um while(true), isto eh, a thread va existir ateh q o programa seja fechado…

espero q tenha esclarecido…

valew!!!

aloha

alguem sabe?

agradeço :wink:

arthurgon

Cara…dá uma ollhada no blog da “Java Anywhere”. Lá eu dou uma explicação de como criar um relógio digital em SWT, e conseqüêntemente…utilizar Thread no SWT.

http://www.javawora.blogspot.com/

Acredite…tbm tive muita dificuldade pra entender essa parte.

Abraço.

aloha

Pelo que li o swt nao eh thread-safe, sendo assim seja la como for feita alguma thread no swt seria gambiarra…

Agora me pergunto, como que pode os caras desenvolverem uma biblioteca gráfica com este “defeito”…
É ridículo, estou muito indignado!!!

Agradeço

KWill

aloha:
Pelo que li o swt nao eh thread-safe, sendo assim seja la como for feita alguma thread no swt seria gambiarra…

Agora me pergunto, como que pode os caras desenvolverem uma biblioteca gráfica com este “defeito”…
É ridículo, estou muito indignado!!!

Agradeço

Acho que tu não andou usando SWT para saber como é que o mesmo funciona. Pelo que eu usei, posso dizer que o SWT normalmente tem performance superior a AWT/Swing, desde que se use o SWT direito. O SWT tem um modelo de uso diferente do AWT/Swing. Veja um trecho da documentação do SWT, falando do objeto Display:

Inté.

aloha

KWill

Usei o swt por uns 5 meses…
Precisei fazer thread ao implementar um jogo de damas em rede.
Hoje estou usando o swing, óbvio que é mais lento… Por isso e outros motivos ainda estou querendo saber como faz thread no swt, para poder voltar.

Você postou um trecho da documentação que apenas reforça a idéia de que não tem como fazer thread… Explicou minha frase (swt não é thread-safe).

Gostaria de informações mais construtivas, alguém ja fez isso que estou querendo fazer? uma thread?
Se alguém fez ajuda por favor!!! Não só eu, mas a outras pessoas…

Abraço

KWill

aloha:
KWill

Usei o swt por uns 5 meses…
Precisei fazer thread ao implementar um jogo de damas em rede.
Hoje estou usando o swing, óbvio que é mais lento… Por isso e outros motivos ainda estou querendo saber como faz thread no swt, para poder voltar.

Você postou um trecho da documentação que apenas reforça a idéia de que não tem como fazer thread… Explicou minha frase (swt não é thread-safe).

Gostaria de informações mais construtivas, alguém ja fez isso que estou querendo fazer? uma thread?
Se alguém fez ajuda por favor!!! Não só eu, mas a outras pessoas…

Abraço

Bom, como o SWT trabalha de maneira diferente, pelo que pude ver, ele praticamente TE OBRIGA a usar alguma outra solução que não seja criar outra Thread além da “user-interface thread”, sendo que tudo que precisa ser feito na interface gráfica esteja implementado no “event loop” da “user-interface thread”. Se tu precisa que alguma outra Thread acesse coisas no Display, ela muitas vezes não poderá fazê-lo manipulando diretamente widgets ou o próprio Display. Eu recomendo que tu deixe um mecanismo para armazenar mensagens para a “user-interface thread” e que a “user-interface thread” possa consumir essas mensagens e faça as manipulações necessárias.

Inté.

arthurgon

Torno a repetir…a Thread convencional como conhecemos…não funciona. É preciso implementar algo chamado “asyncExec” juntamente com a Thread. Antes de dizer que é “gambiarra” a pessoa tem que utilizar o programa e testar todas as opções.

KWill

Opa, verdade, um mecanismo parecido com o que eu sugeri a criar intervindo no “event-loop” já está praticamente feito usando-se asyncExec.

Inté.

aloha

ja fiz isso e não funciona…

mais alguma idéia?

KWill

aloha:
ja fiz isso e não funciona…

mais alguma idéia?

Você poderia postar algum trecho de código usando asyncExec que você diz que não funciona?

Inté.

arthurgon

Eu tbm gostaria de ver esse trecho que não funciona…se puder postar…agradeço.

aloha

normal galera, acho q nao tem segredo nisso…

display.asyncExec(new Runnable()

{

public void run()

{

while(true)

{

chatTextArea.setText(in.readUTF());

}

});

}

onde “in” é um DatainputStream…

valew!!!

KWill

aloha:
normal galera, acho q nao tem segredo nisso…

display.asyncExec(new Runnable()

{

public void run()

{

while(true)

{

chatTextArea.setText(in.readUTF());

}

});

}

onde “in” é um DatainputStream…

valew!!!

Esse “while(true)” aí provavelmente vai congelar a “user-interface thread” quando o “Runnable” for chamado pela “user-interface thread”. Acho que o máximo que você pode fazer é chamar dentro de um “while(true)” o “asyncExec()” passando o seu “Runnable”, só que sem esse laço infinito dentro do seu “Runnable”.

Inté.

aloha

nao soh o while(true) vai travar a tela como o in.readUTF(); tambem, certo?

"Acho que o máximo que você pode fazer é chamar dentro de um “while(true)” o “asyncExec()” passando o seu “Runnable”, só que sem esse laço infinito dentro do seu “Runnable”. "

Não entendi…

fazer a “thread” dentro de um while(true)?

mas dai o programa vai travar naquele ponto do mesmo jeito!

Você tentou rodar?

GALERA NAO TEM COMO!!!

KWill

aloha:
nao soh o while(true) vai travar a tela como o in.readUTF(); tambem, certo?

"Acho que o máximo que você pode fazer é chamar dentro de um “while(true)” o “asyncExec()” passando o seu “Runnable”, só que sem esse laço infinito dentro do seu “Runnable”. "

Não entendi…

fazer a “thread” dentro de um while(true)?

mas dai o programa vai travar naquele ponto do mesmo jeito!

Você tentou rodar?

GALERA NAO TEM COMO!!!

Vou tentar te explicar mais uma vez. Se você tentar passar para via “asyncExec()” ou “syncExec()” um “Runnable” com um laço infinito, há grandes chances da “user-interface thread” ir para o brejo, já que ela vai ficar travada executando seu “Runnable” eternamente. O que deve ser passado via “asyncExec()” ou “syncExec()” devem ser “tarefas finitas”, senão o controle jamais irá voltar para o resto da “user-interface thread”. O que pode ser feito é deixar alguma outra thread que não é a “user-interface thread” fazendo chamadas a “syncExec()” ou “asyncExec()”. E ainda tem aquela opção de tu implementar algum mecanismo de produção e consumo de mensagens na “user-interface thread” que já te dei.

Inté.

KWill

aloha:
nao soh o while(true) vai travar a tela como o in.readUTF(); tambem, certo?

"Acho que o máximo que você pode fazer é chamar dentro de um “while(true)” o “asyncExec()” passando o seu “Runnable”, só que sem esse laço infinito dentro do seu “Runnable”. "

Não entendi…

fazer a “thread” dentro de um while(true)?

mas dai o programa vai travar naquele ponto do mesmo jeito!

Você tentou rodar?

GALERA NAO TEM COMO!!!

Outra coisa que esqueci de te falar, recomendo ler a mensagem via “in.readUTF()” em alguma outra Thread, já que provavelmente haverá bloqueio de I/O, e se o “Runnable” que usa o “in.readUTF()” bloquear enquanto ele estiver sendo executado pela “user-interface thread”, a “user-interface thread” irá obviamente travar também.

Acho que você deveria dar uma olhada na documentação do SWT na parte dos métodos “syncExec()” e “asyncExec()”. Entender um pouco de Threads e bloqueio de I/O também deve ajudar.

Inté.

LoveBozo

Creio que o correto seria:

new Thread() {
	public void run() {
		while (true) {
			String s = in.readUTF();
			display.asyncExec(new Runnable() {
				public void run() {
					chatTextArea.setText(s);
				}
			});
		}

	}
}

Pra mim parece que funciona… Mas ele vai ficar lendo o in muitas vezes, talvez fosse bom controlar esse loop, sei lá =P

aloha

LoveBozo

Este código está certo mas não funciona excepcionalmente no SWT.
O loop nao é um problema pois a thread fica parada no in.readUTF();

KWill

Tudo o que vc diz é certo, mas não construtivo o bastante, poderia ser mais claro? Por favor!

Obrigado

KWill

aloha:
LoveBozo

Este código está certo mas não funciona excepcionalmente no SWT.
O loop nao é um problema pois a thread fica parada no in.readUTF();

KWill

Tudo o que vc diz é certo, mas não construtivo o bastante, poderia ser mais claro? Por favor!

Obrigado

Continuo achando que você não deu uma boa olhada na documentação do SWT como eu te recomendei. Tentarei te explicar mais uma vez.
Eis o que diz a especificação do SWT em relação à classe “Display”:

“Eclipse Platform API Specification”:
In SWT, the thread which creates a Display instance is distinguished as the user-interface thread for that display.
The user-interface thread for a particular display has the following special attributes:

* The event loop for that display must be run from the thread.
* Some SWT API methods (notably, most of the public methods in Widget and its subclasses), may only be called from the thread. (To support multi-threaded user-interface applications, class Display provides inter-thread communication methods which allow threads other than the user-interface thread to request that it perform operations on their behalf.)
* The thread is not allowed to construct other Displays until that display has been disposed. (Note that, this is in addition to the restriction mentioned above concerning platform support for multiple displays. Thus, the only way to have multiple simultaneously active displays, even on platforms which support it, is to have multiple threads.)


O que isso quer dizer? Bom, primeiramente, a Thread que instanciou o Objeto do tipo “Display” torna-se a “user-interface thread”, e ela precisa ter aquele loop que você deve ter feito que fica checando as coisas com "Display.readAndDispatch() " e/ou faz alguma outra coisa. Se essa Thread que é a “user interface thread” travar, a interface gráfica acabará por travar também. Isso que a documentação cita como “inter-thread communication methods” seriam aqueles dois métodos da classe Display que lhe passei, o “asyncExec()”, o “syncExec()”. Quando você chama “Display.asyncExec()” ou “Display.syncExec()”, a Thread que fica incumbida de executar o método “run()” dos “Runnable” que você passou como argumento é a “user interface-thread”, aquela Thread que criou o objeto do tipo “Display”, só que “syncExec()” vai fazer com que a Thread que chamou o método “syncExec()” aguarde até que a execução do “Runnable” passado como parâmetro termine. Por fim, a “user-interface thread” tem a limitação de não poder instanciar outro objeto do tipo “Display” além do primeiro.

Preciso ser mais claro mesmo? Escrevo feito um alienígena? Ninguém me entende?

Inté.

aloha

Resumindo tudo isso: “Não tem como!”

aloha

Não tenho tempo de ficar lendo e lendo pois quando eu estava tentando fazer esta thread no swt, perdi 3 dias em cima disso e nao fui pra frente, dai entao postei este tópico. Na sequencia ja comecei o mesmo projeto no swing, que inclusive ja estou quase terminando, funcionou a thread de primeira, do jeito que tem que ser!

A unica coisa que gostaria era um exemplo de alguém que conseguiu.

Mesmo assim obrigado KWill

KWill

Como não, o código construído pelo LoveBozo não funciona? (não curto muito ficar codificando e entregando o ouro para o pessoal…).

Inté.

aloha

Nao funciona!

KWill

aloha:
Não tenho tempo de ficar lendo e lendo pois quando eu estava tentando fazer esta thread no swt, perdi 3 dias em cima disso e nao fui pra frente, dai entao postei este tópico. Na sequencia ja comecei o mesmo projeto no swing, que inclusive ja estou quase terminando, funcionou a thread de primeira, do jeito que tem que ser!

A unica coisa que gostaria era um exemplo de alguém que conseguiu.

Mesmo assim obrigado KWill

Bom se tu está satisfeito com o que o Swing provê então sem problemas. Demorei horrores para entender o modelo de funcionamento de SWT e para me acostumar com o jeito como ele funciona, mas depois em compensação consegui fazer as coisas com SWT tendo um desempenho superior em relação ao Swing.

Inté.

aloha

No SWT eu programo muito rapido!
Alem dos programas em SWT ficarem mais bonitos e rapidos!!!
Eu gostaria muito de voltar pro SWT, e com certeza se eu for fazer algum programa q nao precise d thread, vou pro SWT… :stuck_out_tongue:
Particularmente acho o Swing um nojo, mas fazer oq? :confused:

Agora se você algum dia conseguiu, da umas dicas de codificação!!! Por favor!

Abraço

LoveBozo
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class TesteThread {
	private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	public static void main(String args[]) {
		final Display display = new Display();
		Shell shell = new Shell(display);
		shell.setLayout( new RowLayout());

		final Text t = new Text(shell, SWT.NONE);

		shell.pack();
		shell.open();

		new Thread() {
			private String s;
			public void run() {   
				while (true) {
					try {
						s = in.readLine();
					} catch (IOException e) {
						e.printStackTrace();
					}
					
					display.asyncExec(new Runnable() {   
						public void run() {   
							t.setText(s);   
						}   
					});   
				}   

			}   
		}.start();

		while( !shell.isDisposed())
		{
			if(!display.readAndDispatch()) 
				display.sleep();
		}
		display.dispose();
		System.exit(0);
	}
}

Funcionou perfeitamente. A diferença é que eu li do console ao invés de um DataInputStream comno você fez, mas dá na mesma. Nota que eu tive que declarar "String s" como variavel da classe de thread, pq pra criar a classe interna do Runnable ele não aceita variáveis locais sem "final". Aliás, isso tava errado no exemplo que eu passei antes, na pressa esqueci disso.
Mas esse eu acabei de testar, digite algo no console e enter, ele coloca no Text.

aloha

deu certo mesmo…

SWT me aguarde :wink:

q felicidade!!!

LoveBozo e KWill

muito obrigado, pelo q percebi sao (eram) os unicos q sabiam fazer isso!!!

abração, to devendo uma!

Criado 13 de agosto de 2008
Ultima resposta 21 de ago. de 2008
Respostas 29
Participantes 5