Diferencias entre las revisiones 5 y 6
Versión 5 con fecha 2007-12-14 16:02:24
Tamaño: 4132
Comentario: 1° revision, anclas y pequeñas correcciones, se actualizo para seguir la guia de estilo de codigo
Versión 6 con fecha 2008-01-02 17:22:13
Tamaño: 3985
Comentario: 2° revision, cambios triviales en las funciones de ejemplo, alteracion de ciertas frases en busca de un lenguaje neutro, sin dirigirse directamente al lector y sin repetir las ideas.
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 7: Línea 7:
Los bucles de ejecución son estructuras que nos permiten realizar programas asíncronos, es decir, no bloqueantes; nos permiten 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. 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.
Línea 9: Línea 9:
De esta manera podemos realizar 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, tambien hay la posibilidad de ejecutar funciones que respondan a eventos de dispositivos de E/S o intervalos de inactividad de un programa. 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.
Línea 11: Línea 11:
La manera de utilizar los bucles de ejecución es: La manera de utilizar los bucles de ejecución es la siguiente:
Línea 13: Línea 13:
 * Primero creamos la variable `GMainloop`
 {{{
GMainLoop *bucle;
 }}}
 * Primero se crea la variable GMainloop
   `GMainLoop *bucle;`
Línea 18: Línea 16:
 * Luego creamos el bucle
 {{{
bucle = g_main_loop_new(NULL, FALSE);
 }}}
 * Luego el bucle
   `bucle = g_main_loop_new(NULL, FALSE);`
Línea 23: Línea 19:
 * Finalmente corremos el bucle
 [[Anchor(g_main_loop_run)]]{{{
g_main_loop_run(bucle);
 }}}
 * Finalmente se ejecuta el bucle
   `g_main_loop_run(bucle);`
Línea 29: Línea 23:
 [[Anchor(g_main_loop_quit)]]{{{
g_main_loop_quit (bucle);
}}}
   `g_main_loop_quit (bucle);`
Línea 33: Línea 25:
Una vez que utilicemos ''[#g_main_loop_run g_main_loop_run]'', el control de nuestra aplicación pasa a manos de Glib. Para poder utilizar las alarmas tenemos dos opciones, una cuando se cumple cierto intervalos de tiempo, ''[#g_timeout_add g_timeout_add]'', y la otra cuando nuestra aplicacion no esta haciendo nada, ''[#g_idle_add g_idle_add]''. 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''.
Línea 41: Línea 33:
guint g_timeout_add (guint intervalo, GSourceFunc función, gpointer data); guint g_timeout_add (guint interval, GSourceFunc function, gpointer data);
Línea 46: Línea 38:
 * `guint intervalo`: Es el intervalo de tiempo en que se llama a la función, debe de estar en milisegundos.
 * `GSourceFunc funcn`: Función a llamar.
 * `gpointer data`: Dato que se pasa a la función como parametro.
 * `guint interval`: Es el intervalo de tiempo en que se llama a la función, debe de estar en milisegundos.
 * `GSourceFunc function`: Función a llamar.
 * `gpointer data`: Dato que se pasa a la función como parámetro.
Línea 53: Línea 45:
Lo mismo pasa con los tiempo de inactividad. Los tiempo de inactividad, son los tiempos en que nuestra aplicación no hace nada, esta inactiva. Para usarlos se utiliza la siguiente función: 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:
Línea 57: Línea 49:
guint g_idle_add (GSourceFunc función, gpointer data); guint g_idle_add (GSourceFunc function, gpointer data);
Línea 62: Línea 54:
 * `GSourceFunc función`: Función a llamar.  * `GSourceFunc function`: Función a llamar.
Línea 66: Línea 58:
Una cosa que hay que tener en cuenta es que en ambos casos cuando se llama a la función externa, la prioridad de esta es asignada de modo por default, `G_PRIORITY_DEFAULT`. Como ya se habia comentado, la prioridad de la funcion a llamar es asignada automáticamente; asi pues, la función puede ser retrasado por otros procesos de mayor prioridad. 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.
Línea 68: Línea 60:
En ambas funciones, la llamada a la función externa tiene que se de cierto tipo, es decir, `GSourceFunc` representa un puntero a una función de la siguiente forma: 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:
Línea 70: Línea 63:
gboolean función_a_llamar (gpointer data); gboolean funcion_a_llamar (gpointer data);
Línea 73: Línea 66:
Asi la función es llamada en varias ocaciones hasta que devuelve FLASE y sale del bucle. Así la función es llamada en varias ocasiones hasta que devuelve `FALSE` y sale del bucle.
Línea 76: Línea 69:
Línea 79: Línea 73:
gboolean nuestra_función(gpointer data); gboolean funcion_a_llamar(gpointer data);
Línea 89: Línea 83:
        b = g_timeout_add(i, nuestra_función, bucle);         b = g_timeout_add(i, funcion_a_llamar, bucle);
Línea 95: Línea 89:
gboolean nuestra_función(gpointer data) gboolean funcion_a_llamar(gpointer data)

Bucles de ejecución

TableOfContents()

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:

  • Primero se crea la variable GMainloop
    • GMainLoop *bucle;

  • Luego el bucle
    • bucle = g_main_loop_new(NULL, FALSE);

  • Finalmente se ejecuta el bucle
    • g_main_loop_run(bucle);

  • Para detener el bucle se utiliza
    • g_main_loop_quit (bucle);

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:

Anchor(g_timeout_add)

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

Veamos los parámetros de esta función:

  • guint interval: Es el intervalo de tiempo en que se llama a la función, debe de estar en milisegundos.

  • GSourceFunc function: Función a llamar.

  • gpointer data: Dato que se pasa a la función como parámetro.

  • Retorno: El id del evento origen.

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:

Anchor(g_idle_add)

guint g_idle_add (GSourceFunc function, gpointer data);

Veamos los parámetros de esta función:

  • GSourceFunc function: Función a llamar.

  • gpointer data: Dato que se pasa a la función como parámetro.

  • Retorno: El id del evento origen.

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: [:Documentacion/Desarrollo/Glib:GLib]

Documentacion/Desarrollo/Glib/BuclesDeEjecucion (última edición 2008-12-04 08:48:56 efectuada por anónimo)