Programa bloqueia a thread da interface gráfica [RESOLVIDO]

5 respostas
andreiribas

galera… tenho um problema…
fiz dois programinhas pra chat… um servidor e outro cliente.
Quando eu clico no botão conectar, lança um método que fica em um while esperando o cliente digitar alguma coisa, e fica aguardando… só que com isso, o programa pára, e não acontece mais nada… a interface gráfica dá pau… acho que essa thread tá bloqueando a thread do gui… quer dizer… será que eu deveria deixar essa parte do programa (do while) em uma thread separada?

5 Respostas

dudaskank

Hmmm, acho que tem algo estranho aí…

Bem, a princípio, é sim seu laço bloqueando tudo aí, então se vc colocar numa thread separada tudo certo.

Mas já existe uma thread separada para esses eventos do teclado, e o que você precisa fazer na verdade é jogar fora seu laço while e implementar a interface KeyListener, que quando houver um evento do teclado, será chamada pra fazer alguma coisa.

Flw

andreiribas
o código a que eu me refiro é este:
while ( !done )  { 
    if( in.hasNextLine() ) {
        String line = in.nextLine();
         String msgServer = "CLIENT: ";
          if (line.trim().equals("BYE")) {
              done = true;
              conectado = false;
          }
          jTextArea1.append(msgServer + line + "\n" );
      } 
           
 }

acho que ele fica passando o while pra sempre... no cliente está o mesmo código... daí eu não consigo conectar nenhum dos dois... logo sempre vai dar esse loop infinito

andreiribas

ainda estou com a dúvida… agora vou disponibilizar os arquivos para quem quiser dar uma olhada… O problema é na interface gráfica, porque eu fiz essse programa pra modo texto e tudo funcionou perfeitamente…

Lmebrando que vocês tem que abrir o programa no netbeans, poruqe usa o layout do netbeans

kuchma

Nao olhei teu codigo, mas voce possivelmente esta bloqueando (ou executando uma tarefa pesada nao-GUI) na thread EventDispatcherThead (nao lembro se eh esse o nome), a thread que controla os eventos do Swing.

  • Realize tarefas demoradas (ou que bloqueiam) nao-GUI em threads separadas.
  • Atualize a GUI apenas na thread EDT.
  • Da uma olhada nos metodos invokeAndWait e invokeLater do SwingUtilities.
  • Procure por “Swing Worker” na internet (esse projeto tem uma implementacao desse “pattern”: https://swingworker.dev.java.net)

Marcio Kuchma

andreiribas

é isso mesmo cara.
como só existia uma thread, quando o servidor inciava ele esperava uma conexão, ele bloqueava a thread do swing, daí o que eu fiz foi colcar a parte para se conectar em uma thread, daí ficou tudo bem.

Se alguém quiser é só pedir que eu disponibilizo o código

Criado 28 de agosto de 2006
Ultima resposta 31 de ago. de 2006
Respostas 5
Participantes 3