alguem sabe como fazer uma thread no swt que altere campos da tela?
obs: esta thread tem um while(true) dentro…
valew
alguem sabe como fazer uma thread no swt que altere campos da tela?
obs: esta thread tem um while(true) dentro…
valew
Dio Mio!!!
Isso não tá mto claro… como assim alterar campos da tela???
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!!!
alguem sabe?
agradeço
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.
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
[quote=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[/quote]
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é.
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
[quote=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[/quote]
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é.
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.
Opa, verdade, um mecanismo parecido com o que eu sugeri a criar intervindo no “event-loop” já está praticamente feito usando-se asyncExec.
Inté.
ja fiz isso e não funciona…
mais alguma idéia?
[quote=aloha]ja fiz isso e não funciona…
mais alguma idéia?[/quote]
Você poderia postar algum trecho de código usando asyncExec que você diz que não funciona?
Inté.
Eu tbm gostaria de ver esse trecho que não funciona…se puder postar…agradeço.
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!!!
[quote=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!!![/quote]
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é.
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!!!
[quote=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!!![/quote]
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é.
[quote=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!!![/quote]
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é.
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