Novedades de Thread en API 2.0: Actualizar la Interfaz de Usuario

Xojo 2019r2 ha traido consigo múltiples mejoras y novedades; entre ellas la capacidad de simplificar la actualización de nuestros elementos de interfaz de usuario desde uno o varios hilos ejecutándose en paralelo junto con el hilo principal de ejecución de la aplicación.Esto era algo para lo cual anteriormente había que recurrir al uso de técnicas más complejas, como el uso de una instancia de Thread en combinación con un Timer encargado de leer los valores actualizados (o generados) por nuestros hilos adicionales para reflejar dichos cambios en la interfaz de usuario.

Desde Xojo 2019r2, con la que se ha introducido la API 2.0 del lenguaje, ahora todo lo relacionado a la actualización de las interfaces de usuario de nuestras aplicaciones desde los Thread se ha simplificado sobremanera, gracias a que la clase añade ahora el evento UserInterfaceUpdate que nos proporciona, en forma de diccionarios, aquellos valores que hayamos pasado precisamente desde el evento Run del hilo.

Para añadir nuevos valores a este diccionario de diccionarios tan sólo hemos de invocar el método AddUserInterfaceUpdate pasando como parámetro un Pair.

El primer valor de este par será precisamente la clave arbitraria que deseemos utilizar para identificar un valor dado, mientras que el elemento situado a la derecha del par será precisamente el nuevo valor que deseemos pasar al hilo principal para, previsiblemente, reflejarlo en cualquiera de los elementos de nuestra interfaz de usuario.

Las dos formas en las que podemos utilizar los nuevos Thread es como veníamos haciendo hasta ahora:

  • Arrastrar un objeto desde la Librería del IDE sobre la bandeja del Editor de Plantillas, de modo que se cree una instancia a partir de la cual podamos implementar tanto el evento Run (el encargado de ejecutar una tarea determinada en el hilo de ejecución) y, ahora, también el evento UserInterfaceUpdate para recibir, ya en el hilo principal, aquellos valores pasados desde el primero.
  • El segundo enfoque es el que tendremos que utilizar cuando deseemos crear las instancias de un Thread desde código, lo que significa que no podremos implementar nuestro código en el evento UserInterfaceUpdate. En este caso la solución es bien sencilla y se corresponde con la que ya hemos venido utilizando en otras múltiples ocasiones. Se trata de emplear AddHandler para asignar el método delegado de nuestra conveniencia como sustitución del evento UserInterfaceUpdate. En este caso, y tal y como ocurre con cualquier otro delegado del Framework (como sucede en el uso de los Timer), sólo hemos de tomar la precaución de que el primer parámetro se corresponda con un tipo de dato Thread (o bien cualquier otra clase derivada de Thread), mientras que el segundo parámetro recibido ha de replicar el recibido originalmente por el evento UserInterfaceUpdate.

En el proyecto de ejemplo que puedes descargar desde este enlace puedes comprobar la implementación de ambos tipos de Thread, así como el modo en el que se envían y posteriormente se accede a los datos recibidos para actualizar elementos de la interfaz de usuario.

En ambos casos puedes comprobar como se obtienen los resultados deseados; esto es, en todo momento la interfaz de usuario permanece activa y continúa respondiendo a las acciones del usuario, mientras que los dos hilos adicionales continúan haciendo su trabajo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *