2010-03-04 10 views
7

Esta es mi primera pregunta sobre StackOverflow (lo siento sobre mi inglés). Trataré de explicar el problema lo mejor que pueda.SWT problema con syncExec()

Tengo una aplicación swt con una aplicación de jade en primer plano en la que tengo una barra de progreso para informar la duración de la aplicación. Para volver a cargar esta barra de progreso que utilizo:

if(Display.getCurrent() != null) { 
    progress.run(); 
} 
else { 
    sShell.getDisplay().syncExec(progress); 
} 

El progreso es:

Runnable progress = new Runnable() { 
    public void run() { 
     if (progressBar.isDisposed()) 
      return; 
     int percentage= (numStep*100)/maxSteps; 
     progressBar.setSelection(percentage); 
     if (numStep >= maxSteps){ 
      label1.setText("The simulation has been completed."); 
      button.setEnabled(true); 
     }  
    } 
}; 

Trato de analizar el tiempo que este Ejecutable toma y es constante, pero cuando analizo esta línea sSehll.getDisplay().syncExec(progress) toma diferentes tiempos (de 0 ms a XXXXms)

he leído este Caus

syncExec (ejecutable ejecutable) es el hilo actual (si es diferente del subproceso de interfaz de usuario de la pantalla) para esperar a que finalice el ejecutable.

Pero el Ejecutable es constante de tiempo ...

Puede alguien me guíe? No entiendo por qué a veces lleva 3 minutos y en otro momento.

Gracias

+1

+1, bienvenido a StackOverflow! He reformateado tu código para ti, pero no hay necesidad de disculparte por tu inglés :) –

+0

Gracias a ti. Sé que esto se sentó hace mucho tiempo, pero me animaron a participar hoy, finalmente. – Michel

Respuesta

1

Según la Display class documentation, syncExec:

hace que el método run() de la ejecutable para ser invocada por el hilo interfaz de usuario en la próxima oportunidad razonable . El hilo que llama a este método se suspende hasta que finalice el ejecutable. Al especificar null como el ejecutable , simplemente se activa el subproceso de la interfaz de usuario.

Por lo tanto, el método de run se está ejecutando en un tiempo constante, pero el objeto Display no siempre puede llamar inmediatamente.

+0

Recuerdo que cuando leí la documentación, ¿pero no hay forma de forzarla? – Michel

+1

Y si alguna vez obtiene syncExec para tomar tres minutos, entonces probablemente tenga código ejecutado en el hilo SWT, que debe colocarse en una cadena de fondo. Hacerlo permitirá que la UI funcione sin problemas nuevamente. –

3

Hay dos métodos en la clase SWT Display, syncExec y aSyncExec. Ambos se usan cuando tienes un hilo que no es el hilo de UI que quiere actualizar la UI de alguna manera. Básicamente, cuando los llamas, básicamente le estás diciendo al hilo de UI que tienes algo que quieres que haga cuando tenga oportunidad. Entonces, el hilo de UI continuará su trabajo actual y en algún momento hará lo que usted le pidió que hiciera. Cuando lo hace, siempre variará dependiendo de qué otro trabajo tenga que hacer el subproceso de la interfaz de usuario en ese momento.

La diferencia entre aSyncExec y syncExec es si el código que lo llama espera a que finalice la ejecución o no. Si llama a aSyncExec, la ejecución de la siguiente instrucción en su cadena de llamada se ejecutará inmediatamente. Si llama a syncExec, su cadena de llamada se sentará y esperará hasta que el subproceso UI realmente ejecute el código y lo devuelva. Al cronometrar el tiempo que se tarda en ejecutar SyncExec, no solo se mide el tiempo que tarda el método de ejecución en ejecutarse, sino también cuánto tiempo antes de que el subproceso de la UI comience a ejecutarlo.

No tenga la tentación de intercambiar syncExec con aSyncExec aquí.Si calcula el tiempo que tarda un SyncExec en ejecutarse, descubrirá que es aún más rápido. Pero eso se debe a que todo lo que está cronometrando es cuánto tiempo lleva decirle al subproceso de IU que tiene algo que hacer (no cuánto tiempo lleva hacerlo).

+0

¿Pero no hay forma de ejecutarlo inmediatamente? – Michel

+0

No. Sin embargo, debería ejecutarse bastante rápido, a menos que su subproceso de interfaz de usuario esté haciendo un montón de trabajo (y si ese es el caso, es posible que desee ver lo que está haciendo e intentar que funcione en un hilo diferente). Si en realidad lleva 3 minutos, ¿supongo que su subproceso de interfaz de usuario está haciendo otra cosa? ¿Está relacionado con el trabajo relacionado con la interfaz de usuario? – DaveJohnston

+0

Sí, está relacionado ... – Michel