Bucles de ejecución

Los bucles de ejecución son estructuras que permiten realizar programas asíncronos, es decir, no bloqueantes; hacen posible ejecutar un bucle que permanece a la escucha de diversos eventos y que envía "señales" a distintas funciones que se registran como interesadas en determinados eventos.

De esta manera se pueden programar aplicaciones, que por ejemplo, realicen cierta función cada determinado tiempo, esto se logra mediante "alarmas", pero no solo se limita a intervalos de tiempo, también está la posibilidad de ejecutar funciones que respondan a eventos de dispositivos de E/S o intervalos de inactividad de un programa.

La manera de utilizar los bucles de ejecución es la siguiente:

Una vez que se utilice g_main_loop_run, el control de la aplicación pasa a manos de Glib. Para poder hacer uso de las alarmas existen dos opciones, la primera cuando se cumple cierto intervalos de tiempo, g_timeout_add, y la otra cuando la aplicación no esta haciendo nada, g_idle_add.

Alarmas

Para utilizar un bucle conjuntamente con una alarma se realizan los pasos anteriormente explicados, pero se usa la siguiente función:

guint g_timeout_add (guint interval, GSourceFunc function, gpointer data);

Veamos los parámetros de esta función:

Tiempos de inactividad.

Lo mismo ocurre para los tiempos de inactividad, es decir aquellos en los que la aplicación no hace nada. Para poder usarlos se utiliza la siguiente función:

guint g_idle_add (GSourceFunc function, gpointer data);

Veamos los parámetros de esta función:

Un factor a considerar es que en ambos casos cuando se llama a la función externa, la prioridad de esta es asignada de modo por omisión, G_PRIORITY_DEFAULT. Como ya se había comentado, la prioridad de la función a llamar es asignada automáticamente; así pues, la función puede ser retrasada por otros procesos de mayor prioridad.

En ambas funciones, la llamada a la función externa tiene que se de un tipo determinado, es decir, GSourceFunc representa un puntero a una función de la siguiente forma:

gboolean funcion_a_llamar (gpointer data);

Así la función es llamada en varias ocasiones hasta que devuelve FALSE y sale del bucle.

Ejemplo 6-6.1. Veamos un ejemplo de la forma de utilizar la función g_timeout_add.

   1 #include <glib.h>
   2 
   3 gboolean funcion_a_llamar(gpointer data);
   4 
   5 int
   6 main (int argc, char *argv[])
   7 {
   8         GMainLoop *bucle;
   9         guint b;
  10         guint i = 5000;
  11         
  12         bucle = g_main_loop_new(NULL, FALSE);
  13         b = g_timeout_add(i, funcion_a_llamar, bucle);
  14         g_main_loop_run(bucle);
  15         g_print("Ya salimos del bucle.\n");
  16         return 0;
  17 }
  18 
  19 gboolean funcion_a_llamar(gpointer data)
  20 {
  21         gint i=0;
  22         do{
  23                 g_print("Uso de g_timeout_add: %d\n", i);
  24                 i++;
  25         }while(i<3);
  26         g_print("Ahora vamos a finalizar el bucle.\n");
  27         g_main_loop_quit(data);
  28         
  29         return FALSE;
  30 }


Volver a: GLib

Documentacion/Desarrollo/Glib/BuclesDeEjecucion (last edited 2008-12-04 08:48:56 by localhost)