Hilos y gvSIG (1 de 4)

En muchas ocasiones tenemos que implementar algún proceso en gvSIG que requiere cierto tiempo, y al ejecutarlo deja bloqueada la interface de usuario. Este tipo de procesos son candidatos ideales para ejecutarlos en un hilo separado permitiendo así que el usuario pueda interactuar con otras partes de gvSIG mientras éste se esta ejecutando. Sin embargo muchas veces no lo hacemos por que esto conlleva cierta complicación añadida. Intentar acceder al interface de usuario desde un hilo que no sea el hilo principal de gvSIG puede causar efectos inesperados en ella o incluso provocar que ésta quede bloqueada. Algo tan simple como actualizar una barra de progreso o presentar un mensaje al usuario desde el hilo de nuestro proceso puede convertirse en una pesadilla.

Ahora bien, en gvSIG 2 se han introducido algunas herramientas que nos pueden facilitar estas cosas. No es que nos vayan a quitar todo el trabajo o que podamos desentendernos de los problemas inherentes a trabajar con swing y múltiples hilos de ejecución, pero si ayudarnos con algunas cosas.

Las principales dificultades que nos solemos encontrar cuando intentamos ejecutar un proceso en un hilo separado de ejecución giran alrededor de:

  • Presentar al usuario un indicador del progreso de nuestro proceso.
  • Dar opción al usuario a poder cancelar la ejecución del proceso.
  • Poder presentar al usuario información o requerir de él información a lo largo de la ejecución del proceso. Por ejemplo durante la ejecución del proceso se produce alguna condición de error y queremos preguntar al usuario para poder continuar y no abortar la ejecución de éste.

En relación a estas tareas podemos encontrar algunas herramientas en gvSIG para ayudarnos con ellas. En la librería org.gvsig.tools nos encontraremos con:

  • TaskStatus. Un mecanismo que nos permite gestionar el estado de nuestro proceso. Si se encuentra en ejecución, qué medida de progreso tiene, en qué estado del proceso se encuentra, o requerir su cancelación si fuese necesario.
  • AbstractMonitorableTask. Una clase que extiende a Thread integrando con él un TaskStatus para su gestión.

Y en la clase ApplicationManager del plugin org.gvsig.app, encontraremos métodos que nos permiten:

  • Presentar mensajes en la barra de estado de la aplicación
  • Presentar cuadros de dialogo del tipo de showMessageDialog.
  • Presentar cuadros de dialogo del tipo de showConfirmDialog.
  • Presentar cuadros de dialogo del tipo de showInputDialog.
  • Construir componentes de swing
  • Presentar cuadros de dialogo al usuario

Todo ello asegurándose que estas tareas se ejecutan en el hilo de ejecución del manejador de swing de forma que no tengamos que preocuparnos por esto desde el hilo de nuestro proceso.

Además de estas herramientas, el entorno de andami esta pendiente de las instancias de TaskStatus que se van creando y presenta en la barra de estado de la aplicación información resumida de estas de forma automática, para que no tengamos que preocuparnos por generar interface de usuario para ellas si no queremos una presentación específica.

A lo largo de estos cuatro artículos veremos:

  1. Cuáles son los principales métodos y funcionalidad que nos ofrece el artefacto TaskStatus.
  2. Cuál podría ser la estructura de nuestro proceso y como lanzarlo desde una extensión.
  3. Cómo podríamos interactuar con el usuario de forma simple desde nuestro proceso.

En el próximo artículo, “Hilos y gvSIG (2 de 4): TaskStatus“,  continuaremos viendo cuáles son las principales funcionalidades que nos ofrecen las utilidades de TaskStatus.
Un saludo

Joaquín

About Joaquin del Cerro

Development and software arquitecture manager at gvSIG Team. gvSIG Association
This entry was posted in development, gvSIG Desktop, spanish and tagged . Bookmark the permalink.

One Response to Hilos y gvSIG (1 de 4)

  1. Pingback: Hilos y gvSIG (2 de 4): TaskStatus | gvSIG blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s