Threads

Hola otra vez,
Soy el del simulador gráfico. Cuando pauso el thread las bolas se quedan quietas pero cuando vuelvo a activar el thread las bolas que habían sobre la cinta se siguen quedando quietas y me aparecen otras nuevas desde el inicio.
Te comento como gestiono la salida de las bolas. Obteniendo los datos de una BDD MySQL y una serie de cálculos obtengo una cadencia en las bolas y las bolas que debe haber sobre la cinta, luego me creo un vector de bolas de dimension igual al numero de bolas sobre la cinta +1. Una cosa es el refresco del thread y otra la frecuencia con la que saco una bola, esto lo consigo con un temporizador.
Lo que tu has llamado cinta transportadora, yo lo había llamado thProceso, y lo que me activa las bolas lo he llamado Proceso (es donde se encuentra el temporizador).
Así que tengo;
-------- CLASE PROCESO -----------------
public Proceso(..){..
   num_bolas=(int) (long_pixeles / pixels_entre_bolas)+1;
   ball=new Bola[num_bolas];
   for(int j=0;j     ball[j]=new Bola(radioBolita);
     ball[j].coordX=-1;
     ball[j].coordY=-1;
   }
iniciarThread(); // me inicia el thread que desplaza las bolas
ejecutaTemporizador(); //cada cierto tiempo me activa una bola
}
-------- CLASE THPROCESO ----------------- 
public thProceso(..){}
public void run(){
  while(th1!=null){
       synchronized(this){
             if(estado_thread==EN_EJECUCION){
                    // una serie de condiciones para que se desplacen en cualquier direccion
             }else{
                  // no hago nada
            }
            try {
                Thread.sleep(tiempo_thread_milis);
           } catch (Exception e) {}
       }
  }
}
---------------------------------------------------------------
¿Le ves alguna pega a esta forma de pensarlo?, ¿Se te ocurre algo mejor?
¿Por qué crees que suceda lo que te he comentado anteriormente?
Venga, muchas gracias!

1 respuesta

Respuesta
1
Creo que se lo que te está pasando. Por lo que veo, cuando pausas la cinta, no pausas el proceso de creación de bolas. Creo que tu problema se solucionaría pausando y reiniciando el temporizador que controla la creación de bolas, a la vez que pausas y reinicias el thread de movimiento de las bolas. Lo de pausar el temporizador te será más fácil si usas un javax. Swing. Timer, y no java. Útil. Timer. Con los métodos stop() y restart() puedes hacerlo. Lo único que a lo mejor (no estoy seguro de que sea necesario), tendrás que controlar que cuando pauses, calcular el tiempo que le queda al timer hasta que salte la siguiente ejecución, para meter un setInitialDelay() antes del restart(), aunque creo que restart() ya controla lo del delay.
Bueno, es una idea. Otra forma de hacerlo es no usar el temporizador de creación de bolas, y usar el bucle de movimiento, para que cada ciertas iteraciones (calculadas como periodo de creación de una nueva bola/periodo de refresco del movimiento de las bolas) cree una nueva bola. Con este método te quitarás de muchos problemas, ya que al pausar el movimiento se pausa todo.
Espero haberte dado alguna idea. Trabajar con hilos es de lo más entretenido, ¿verdad? ;-)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas