Swing e classe com 02 thread's

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

posta os códigos ai que pode ajudar

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.

[]'s

Luiz Renato

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.

com calma ai vini, vc ta no ‘java básico’ IHUHAIUEA

Olá Vini !
Até que tentei fazer desta forma mas não consegui … :cry: :cry:
Se vc puder postar um exemplo, agradeço !! :slight_smile:

Mas estou lendo a respeito do “Observer” comentado pelo Luiz Renato, me parece que já consigo resolver o meu problema.

Atenciosamente,
Wagner

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.

Wagner

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… :wink:

[]'s

Luiz Renato

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á !
Será que alguém poderia me ajudar ?
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.

Aqui tem um exemplo de uma thread que atualizar a interface gráfica para fazer um relógio funcionar. Talvez você consiga adapta-lo ao seu problema:
http://www.guj.com.br/posts/list/52964.java#279083

Pelo menos ele mostra a maneira certa de fazer uma thread qualquer empilhar um evento na thread do Swing.

Olá Vini !
Desculpe ! Não foi a intenção de upar o tópico, mas é que preciso aprender e desenvolver …
Ok, obrigado !! Vou verificar :slight_smile:
Atenciosamente,
Wagner