Java - Sleep extraño ¿?

 
Vista:

Sleep extraño ¿?

Publicado por hithwen (1 intervención) el 06/04/2007 16:03:36
Hola, estoy haciendo un pequeño interprete de un lenguaje con 3 ó 4 instrucciones. La interfaz principalmente de dos TextArea, en la primera esta el codigo a interpretar y en la segunda voy sacando mensajitos.

Una de las funciones que implementa el programa es "ejecutar paso a paso", como ando bastante verde en el asunto lo mejor que he encontrado es hacer un sleep en cada vuelta del programa mientras voy monitorizando en el TextArea de los mensajes el estado de las variables y seleccionando en el codigo la instruccion que se está ejecutando...

Mi problema es el siguiente, en los textArea no se selecciona ni se escribe nada hasta que el programa no termina del todo, entonces aparece la informacion de cada iteracion... es muy extraño porque si en vez de escribir en el textArea escribo en consola si que se escribe una linea cada segundo. ¿Alguna idea?

Este es el procedimiento al que se llama en cada iteracion si la ejecucion es paso a paso:

private void pasoApaso() throws InterruptedException {
Point pto=linea(instruccion);
ed.Texto.select(pto.x, pto.y); //Para hacer un highlight en la linea q estoy ejecutando;
sleep(1000);
ed.Texto.select(0, 0);

try {}
finally {}
monitorizar();
}

private void monitorizar(){ // Este procedimiento es el que escribe en el textArea el estado de las variables
String s="";
for (int j=0;j<variables.length;j++){
s=s+"x"+(j+1)+"="+variables[j]+", ";
}
s=s.substring(0,s.length()-2);//quitar la coma final
ed.Errores.insert(("\n"+s),(ed.Errores.getText()).length());
System.out.println(s);//<<---------Esto SI que sale cada segundo :S:S:S
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Sleep extraño ¿?

Publicado por Pablo (39 intervenciones) el 08/04/2007 01:46:19
hithwen:

Para tener certeza, debería ver el código completo. Pero, por lo que veo, no estás actualizando las áreas de texto en un Thread separado.
Si esto es así y estás realizando todo el procesamiento en el formulario, el hilo de ejecución principal (el form) toma el control de todos los componentes visuales y no los libera hasta que termina la actividad (el que tiene el sleep).

Solución 1:

Deberías utilizar un Thread separado para realizar la ejecución "paso a paso", de esta manera, este nuevo hilo, toma el control de los TextAreas y podrás verlo como lo tenías planeado

Solución 2:

El JDK 1.6 incorpora la clase SwingWorker. Puedes usarla para realizar todo este procesamiento (es menos compleja que usar un Thread aparte)
De esto tenía en mi blog ejemplos, pero SiteSed me borró la cuenta, si me mandas un email, te lo reenvío.

Espero que te sirva
Saludos
Pablo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar