Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con hilo

Estas en el tema de Problema con hilo en el foro de Java en Foros del Web. Hola a todos!! Tengo un pequeño problema con esto de los hilos en Java. El caso es que estoy desrrollando una sencilla aplicación cuyo algoritmo ...
  #1 (permalink)  
Antiguo 13/01/2007, 06:02
 
Fecha de Ingreso: diciembre-2006
Mensajes: 7
Antigüedad: 17 años, 4 meses
Puntos: 0
Problema con hilo

Hola a todos!!

Tengo un pequeño problema con esto de los hilos en Java. El caso es que estoy desrrollando una sencilla aplicación cuyo algoritmo recursivo puede llegar en ciertos casos a consumir mucho tiempo, así q he decidido lanzarlo en un thread a parte mientras se muestra un jDialog con un progressBar y un botón de pausar.
El caso es que el jDialog se crea pero no se ve mas que los bordes de su ventana, por lo que no puedo pulsar botón alguno ni ver la barra.

Aquí os pongo el código por si podeis hecharme una mano:

public Pantalla3() {
super("Resultado del algoritmo de satisfacibilidad.");
initComponents();

// enEspera es el jDialog
enEspera.setSize(375,140);
enEspera.setLocationRelativeTo(null);
enEspera.setVisible(true);

miAlgoritmo = new Algoritmo();
miAlgoritmo.start();

while(miAlgoritmo.isAlive()){}

enEspera.setVisible(false);

resultado = miAlgoritmo.satisfacible;
if(resultado) {
jTextField1.setText("SATISFACIBLE");
} else {
jTextField1.setText("INSATISFACIBLE");
}
arbol = Pantalla2.raiz.visualizar("");
jTextArea1.setText(arbol);
}

Gracias por adelantado.
  #2 (permalink)  
Antiguo 13/01/2007, 10:43
 
Fecha de Ingreso: diciembre-2006
Mensajes: 25
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Problema con hilo

Wop!

en el thread del algoritmo recursivo tienes algun Thread.yield() ??
  #3 (permalink)  
Antiguo 13/01/2007, 11:13
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problema con hilo

Cita:
while(miAlgoritmo.isAlive()){}
Ahi tienes a tu programa esperando a que acabe el thread, sin dejarle hacer nada mas, asi que no puede pintar, ni responder a eventos ni nada.

Lo habitual es dejar seguir al programa y que el Thread al acabar notifique al programa principal a través de un metodo, y entonces actualizar la interfaz con los resultados. Si no, bloqueas tu programa, entero, esperando por el thread.

S!
  #4 (permalink)  
Antiguo 15/01/2007, 06:20
 
Fecha de Ingreso: diciembre-2006
Mensajes: 7
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Problema con hilo

Hola a todos. Me ha sorprendido la rapidez de las respuestas, por lo que hasta hoy no me había tomado la libertad de volver a mirar el foro.

Respondiendo a marto_dev:

pues no he puesto ningún yield() en el algoritmo. Acabo de probar a ponerlo, por si en ese caso aprovechaba el cambio de estado para repintar la ventana y el resultado no ha variado

En respuesta a GreenEyed:

suena muy bien (y lógico) lo que propones. Probaré que tal me va modificandolo tal como dices y ya os contaré como me ha ido.

Muchisimas gracias a los dos!!!!
  #5 (permalink)  
Antiguo 15/01/2007, 06:26
 
Fecha de Ingreso: diciembre-2006
Mensajes: 7
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Problema con hilo

¡¡¡FUNCIONA!!!

Probé a hacerlo como has propuesto, GreenEyed, y funciona a las mil maravillas.

Gracias de nuevo a los dos.

Hasta la proxima duda.
  #6 (permalink)  
Antiguo 15/01/2007, 07:26
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Problema con hilo

Me alegro que funcione .

Para explicar por qué, hay que entender que hay dos Threads que no lanzas tú y que se encargan de hacer funcionar tu programa y repintarlo:
.- Uno es el "Thread main" que es el que "lanza tu programa" cuando lo llamas, suele usarse para construir la interfaz etc y que normalmente acaba él mismo despues de crear la interfaz.

.- El otro es el "Thread de eventos" (tambien llamado Event Dispatch Thread) que se encarga de tratar los eventos que ocurren en la interfaz y es el que llama a los "listeners" cuando tu haces algo y toca generar un evento para que lo traten. Desde este thread es desde donde hay que hacer modificaciones al GUI, y es el que actualiza los componentes.

Si paras cualquiera de los dos, entonces dejas la interfaz de tu programa "colgada". Por eso las tareas largas es mejor hacerlas en otros Threads (usando SwingWorker por ejemplo) y así dejar a esos dos, principalmente el de eventos, tranquilos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:23.