Los trabajos de larga ejecución (aquellos que duran más de un segundo) deben informar del progreso al IProgressMonitor que se pasa al método run del trabajo. La vista de progreso del entorno de trabajo mostrará todos los mensajes de progreso y unidades de trabajo completado dadas a este supervisor.
El supervisor de progreso suministrado también debe utilizarse para comprobar si existen peticiones de cancelación efectuadas desde la vista de progreso. Cuando un usuario (o conector que utilice la API de trabajos) intente cancelar un trabajo, el método isCanceled() de IProgressMonitor devolverá true. Es responsabilidad del trabajo comprobar con frecuencia el estado de cancelación de un trabajo y responder a una cancelación saliendo del método run en cuanto sea posible una vez detectada la cancelación. El siguiente método run informa del progreso y responde a la cancelación del trabajo:
public IStatus run(IProgressMonitor monitor) { final int ticks = 6000; monitor.beginTask("Realizando algún trabajo", ticks); try { for (int i = 0; i < ticks; i++) { if (monitor.isCanceled()) return Status.CANCEL_STATUS; monitor.subTask("Procesando ciclo #" + i); //... realizar algún trabajo... monitor.worked(1); } } finally { monitor.done(); } return Status.OK_STATUS;
}
El método beginTask se utiliza para nombrar la tarea en la vista de progreso correspondiente y para establecer la cantidad total de trabajo que debe realizarse para que la vista pueda calcular el progreso. Los mensajes de subTask aparecerán como hijos en el árbol de progreso a medida que se realice el trabajo. La vista de progreso calculará y visualizará un porcentaje de finalización basado en la cantidad de trabajo notificada en las llamadas worked.
Como puede observar, la clase IProgressMonitor
está diseñada teniendo en cuenta el soporte de UI correspondiente. El conector de UI de la plataforma suministra soporte para que el entorno de trabajo pueda mostrar el progreso de los trabajos que se están ejecutando. Puede configurar los trabajos teniendo esto en cuenta, para poder controlar su presentación.
Consulte la sección Soporte de simultaneidad del entorno de trabajo
para obtener una visión detallada de las API disponibles para mostrar el progreso de los trabajos.
¿Qué ocurre si el trabajo es un detalle de implementación de bajo nivel que no desea mostrar a los usuarios? Puede marcar el trabajo como trabajo del sistema. Un trabajo del sistema es como cualquier otro, excepto que el soporte de UI correspondiente no configurará una vista de progreso ni mostrará ningún otro elemento de UI asociado con la ejecución de un trabajo. Si no es el usuario quien inicia directamente el trabajo ni tampoco lo hace una tarea periódica que el usuario pueda configurar, el trabajo debe ser un trabajo del sistema. El protocolo para establecer un trabajo del sistema es simple:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
La llamada a setSystem debe realizarse antes de planificar el trabajo. Se desencadenará una excepción si intenta esta llamada en un trabajo que actualmente esté en espera, latente o en ejecución.
Si el trabajo es una operación de larga ejecución iniciada por el usuario, debe marcarlo como trabajo de usuario. Un trabajo de usuario aparecerá en un diálogo de progreso modal que proporciona un botón para mover el diálogo a segundo plano. El entorno de trabajo define una preferencia de usuario que controla si estos diálogos son modales. Al definir el trabajo como trabajo de usuario, la información de progreso se ajustará automáticamente con las preferencias de usuario con respecto a la visualización del progreso. El protocolo para establecer un trabajo de usuario es similar:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
La llamada a setUser también debe realizarse antes de planificar el trabajo.
Los grupos de progreso son otro mecanismo que puede utilizarse para influir sobre la forma en que un trabajo se muestra en la UI. Cuando sea más adecuado mostrar el progreso sumatorio de varios trabajos relacionados en la UI, puede crearse un IProgressMonitor que represente un grupo de trabajos relacionados. Este supervisor se crea mediante el protocolo IJobManager. El siguiente fragmento de código muestra cómo crear un grupo de progreso y asociarlo con un trabajo.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup(); job.setProgressGroup(myGroup, 600); // especificar las unidades de trabajo que el trabajo debe mostrar. job.schedule() ...
El recurso de grupo permite a los conectores dividir las tareas en varios trabajos si es necesario, pero notificarlas al usuario como si se tratara de una sola tarea. El supervisor de grupo de progreso manejará los detalles del cálculo del porcentaje de finalización en relación a todos los trabajos del grupo.
El trabajo debe colocarse en el grupo de progreso antes de planificarlo. Una vez que el trabajo ha finalizado, su referencia al grupo de progreso se pierde. Si el trabajo debe planificarse de nuevo, debe establecerse de nuevo en el grupo antes de planificarlo.