Thread no swt

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

[quote=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[/quote]

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”:

[quote=“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.)

[/quote]
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é.

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

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

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é.

Nao funciona!

[quote=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[/quote]

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é.

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

[code]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);
}

}
[/code]

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.

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!