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

hilos y repaint

Estas en el tema de hilos y repaint en el foro de Java en Foros del Web. Hola a todos, me gustaria saber como puedo hacer en java para poder esperar que termine la ejecucion de un hilo que llama en un ...
  #1 (permalink)  
Antiguo 14/06/2009, 12:44
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
hilos y repaint

Hola a todos,

me gustaria saber como puedo hacer en java para poder esperar que termine la ejecucion de un hilo que llama en un bucle a repaint para ir refrescando la pantalla, para seguir con otra acción fuera de ese hilo cuando el primero termine.

El problema que tengo es que si ejecuto ese hilo normalmente, el efecto que hago con el repintado funciona perfectamente, pero en cuanto meto código para esperar a que termine esa acción, no me muestra el efecto que produce el repintado.

He probado con el método join(), y usando una variable como bandera en un bucle, pero en ambos casos, la acción de refrescarse la pantalla en el hilo no se muestra.

Un saludo y gracias.
  #2 (permalink)  
Antiguo 14/06/2009, 13:15
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: hilos y repaint

No acabo de entender exactamente lo que explicas, pero hay que tener en cuenta que no se debe trabajar en el hilo de eventos puesto que si hacemos cosas, hasta que no terminemos ese hilo no puede continuar con su trabajo que es, entre otras cosas, repintar la pantalla.

En este tema del Java Tutorial explican las interacciones entre Threads y como organizar las cosas para que no se bloqueen las acciones de repintar, activar botones etc.:
http://java.sun.com/docs/books/tutor...g/concurrency/

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 15/06/2009, 06:51
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Respuesta: hilos y repaint

Cita:
Iniciado por GreenEyed Ver Mensaje
No acabo de entender exactamente lo que explicas, pero hay que tener en cuenta que no se debe trabajar en el hilo de eventos puesto que si hacemos cosas, hasta que no terminemos ese hilo no puede continuar con su trabajo que es, entre otras cosas, repintar la pantalla.

En este tema del Java Tutorial explican las interacciones entre Threads y como organizar las cosas para que no se bloqueen las acciones de repintar, activar botones etc.:

S!
Pongo un ejemplo. En el siguiente programa, lo que quiero es que se muestre en pantalla un número, que va cambiando aleatoriamente entre valores del 1 al 3, durante uno o dos segundos, e imprimir el número en el que se ha quedado. El problema es que tengo que esperar a que el hilo que cambia los números termine, y haciendo esto no me repinta la pantalla, con lo cual pierdo el efecto visual de números cambiando aleatoriamente.

Si probáis el programa y luego comentáis las líneas que indico en el mismo y volvéis a ejecutar se ve claro cual es el problema.

Gracias por vuestra ayuda.

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.JApplet;

public class PruebaHilosRepaintSwing extends JApplet implements Runnable{

Thread hiloNumeros = null;
double numeroActual = 0; //Número que muestro en pantalla y que quiero
//imprimir en el log tras la ejecución del hilo

public void init(){
//Al pinchar en el applet ejecuto el hilo
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
ejecutarHiloNumeros();
}
});
}

public void ejecutarHiloNumeros(){

hiloNumeros = new Thread(this);
hiloNumeros.start();

//Si comento el siguiente trozo de código, el efecto de los números
//alternándose funciona correctamente, pero no se imprime en el log,
//el valor que queda en pantalla, que es lo que pretendo, ya que se ejecuta
//antes de que se ejecute el hilo
try {
//Espero a que el hiloNumeros termine su ejecución
hiloNumeros.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//Comentar hasta aquí

System.out.println("El numero actual es: " + numeroActual);

}

public void paint(Graphics g){

super.paint(g);

g.setColor(Color.GREEN);
g.setFont(new Font("", Font.ITALIC, 50));
g.drawString("" + numeroActual, 50, 50);
}

public void run() {

Random random = new Random();

for (int i = 0; i < 40; i++){

//Voy pintando el número aleatorio
numeroActual = random.nextDouble();
repaint();

try {
hiloNumeros.sleep(60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
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 00:02.