2010-07-03 8 views
5

Tengo un subproceso de trabajo que debe esperar a que EDT actualice la GUI antes de continuar la ejecución. He usado el método de publicación para decirle a EDT que cambie algo. ¿Cómo puedo hacer que el trabajador espere que ocurra ese cambio?subproceso de trabajador oscilante de Java para esperar EDT

+2

¿Te refieres a un botón 'Pause'? – trashgod

+2

Suena como algo realmente malo que desea probar. –

Respuesta

4

Si se trata también de su misma subproceso de trabajo que inicia los cambios en la interfaz, entonces no hay un mecanismo que ya están construidos para la espera de los cambios a realizar:

SwingUtilities.invokeAndWait()

debe ajustarse a la factura bien.

Otra alternativa sería usar SwingUtilities.invokeLater() para darle al EDT algún código para ejecutar, lo que activará su subproceso una vez que el EDT quede inactivo, es decir, cuando se disponga a ejecutar esta tarea. Esto implica disparar invokeLater() inmediatamente seguido de wait() y esperar que la activación del EDI no se produzca antes de hacer el wait(). Sin embargo, esto no es completamente infalible con respecto al tiempo.

5

Supongo que está utilizando SwingWorker para publicar sus resultados. Puede usar un indicador booleano para indicar que el valor ha sido procesado. Este indicador se borra antes de publicar resultados intermedios, y luego se usa para bloquear el hilo hasta que se establece. El subproceso de la interfaz de usuario establece el indicador cuando finaliza el procesamiento de los datos publicados.

class MyWorker extends SwingWorker<K,V> 
{ 
    boolean processed = true; 

    protected void doInBackground() { 
     for (;;) { 
      setProcessed(false); 
      publish(results); 
      waitProcessed(true); 
     } 
    } 

    synchronized void waitProcessed(boolean b) { 
     while (processed!=b) { 
      wait(); 
     } 
     // catch interrupted exception etc. 
    } 

    synchronized void setProcessed(boolean b) { 
     processed = b; 
     notifyAll(); 
    } 


    protected void process(List<V> results) { 
     doStuff(); 
     setProcessed(true); 
    } 
} 
+0

gracias por su respuesta. Sin embargo, he elegido el método de Carl Smotricz, porque tenía más sentido en mi situación y me había olvidado por completo de invocar y esperar. Pero el método que ha sugerido todavía es bueno saber. – Mihaela

Cuestiones relacionadas