Boa tarde PessoALL !
Estou implementando um sistema em Swing que envio uma informação em hexadecimal para um equipamento/impressora e aguardo o retorno, fico aguardando o retorno que pode ser:
“OK” -> impressão realizada com sucesso.
“Error” -> impressão não realizada, devido o erro. Mas o erro também pode ser por causa da demora da resposta, acima de 10 milesegundos já posso considerar erro.
Fiz a criação de 01 classe com 02 threads:
entrada / reader -> para a leitura dos dados
saída / writer -> para o envio dos dados
Com os testes realizados, verifiquei o envio e o retorno pelo modo debug que esta sendo feito, o processo é executado corretamente.
Mas não estou conseguindo fazer com que o sistema em Swing aguarde a execução da classe das 02 thread’s e aguarde também a verificação do retorno do envio para dar a mensagem de correto ou erro. Ou aguardar o tempo de 10 milesegundos para dar mensagem de erro.
Teria alguma forma de sincronizar o sistema em Swing com a classe que executa as thread’s de envio e recebimento, apesar de serem 02 thread’s independentes ?
Como posso fazer ? Poderiam me ajudar ?
Desde já agradeço pela ajuda e fico aguardando as respostas / sugestões.
Atenciosamente,
Wagner
Um idéia seria usar o padrão Observer ( aqui no GUJ http://www.guj.com.br/article.show.logic?id=47 ) onde sua classe Swing seria um Observer aguardando que as classes que lidam com I/O notificar as operações com o dispositivo.
Se esse retorno é rápido, outra possibilidade seria transformar o objeto em um objeto síncrono. Quando o swing chama-lo, vc chama wait() na thread, e quando o retorno vier do dispositivo, você dá um notify(). É uma boa definir timeouts para caso o dispositivo resolva ficar mudo.
O observer resolve sim o problema. Mas ele trata de forma assíncrona. Isso pode ser mais eficiente em muitos casos, mas deixa a classe mais difícil de usar (principalmente se ela precisar ser usada fora de uma GUI).
Eu já fiz classes dos dois jeitos e um tipo não é melhor que o outro. Vale a pena conhecer os dois.
Vou ver se posto um exemplo. Mas demora um pouco para elaborar. Vou tentar fazer na hora do almoço.
Como o Vini falou é muuito bom vc pensar sobre o timeout em se tratando de leitura/escrita em I/O e vc verá isso quando entregar o sistema pro usuário.
Mesmo que vc implemente inicialmente o Observer , vai por mim estude e tente fazer o sincronismo tbm (até mesmo pra aprender e aprofundar ) pois vão ter situações que ele se mostra mais apropriado , não tenha dúvida.
Estou estudando pra certificação e esta parte de sincronismo está me matando…
Olá !
Fiz a implementação do Observer mas não esta retornando o valor para a interface Swing.
Segue abaixo os códigos na classe Swing:
private void executaProcesso(
Classe classe = new Classe(this);
boolean flaTestado = classe.conexao();
if (flaTestado){
classe.enviar(mensagem, retorno);
processo = new Thread(classe);
processo.start();
}
}
public void update(Observable o, Object arg) {
if (arg instanceof Integer) {
System.out.println("numero tentativas: "+String.valueOf(((Integer) arg).intValue()));
} else if (arg instanceof Boolean) {
boolean flaTeste = true;
flaTeste = Boolean.valueOf( ((Boolean) arg).booleanValue() );
if (flaTeste) {
System.out.println("teste executado corretamente.");
}else{
System.out.println("ERRO - teste.");
}
}
}
Coloquei para imprimir as entradas e saídas pelo “System.out.println” dos métodos mas não é realizado o tratamento do método update do Observer.
Será que por causa da criação da Thread no método executaProcesso e também a forma de passar ?
Como posso fazer ? Poderiam me ajudar ?
Desde já agradeço pela ajuda e fico aguardando as respostas / sugestões.
Atenciosamente,
Wagner
Olá !
Teria algum exemplo de código utilizando a Thread sincronizada com a interface Swing ?
Será que alguém poderia me ajudar ?
Atenciosamente,
Wagner
O exemplo que você quer é bastante específico, por isso acho que upar o tópico não vai adiantar muito. Infelizmente, ainda não tive tempo para elabora-lo.
Olá Vini !
Desculpe ! Não foi a intenção de upar o tópico, mas é que preciso aprender e desenvolver …
Ok, obrigado !! Vou verificar
Atenciosamente,
Wagner