Diferencias entre las revisiones 4 y 5
Versión 4 con fecha 2007-12-12 14:04:53
Tamaño: 3848
Comentario: Prueba de Include sin titulo, pero dejando como referencia los marcadores del mismo
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
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 13: Línea 13:
 * Primero creamos la variable GMainloop
 `GMainLoop *bucle;`
 * Primero creamos la variable `GMainloop`
 {{{
GMainLoop *bucle;
 }}}
Línea 17: Línea 19:
 `bucle = g_main_loop_new(NULL, FALSE);`  {{{
bucle = g_main_loop_new(NULL, FALSE);
 }}}
Línea 20: Línea 24:
 `g_main_loop_run(bucle);`  [[Anchor(g_main_loop_run)]]{{{
g_main_loop_run(bucle);
 }}}
Línea 23: Línea 29:
 `g_main_loop_quit (bucle);`  [[Anchor(g_main_loop_quit)]]{{{
 
g_main_loop_quit (bucle);
}}}
Línea 25: Línea 33:
Una vez que utilicemos ''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'', y la otra cuando nuestra aplicacion no esta haciendo nada, ''g_idle_add''. 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]''.
Línea 31: Línea 39:
`guint g_timeout_add (guint intervalGSourceFunc function gpointer data);` [[Anchor(g_timeout_add)]]
{{{
guint g_timeout_add (guint intervalo, GSourceFunc función, gpointer data);
}}}
Línea 35: Línea 46:
 * `guint interval`: Es el intervalo de tiempo en que se llama a la función, debe de estar en milisegundos.
 * `GSourceFunc function`: Funcion a llamar.
 * `guint intervalo`: Es el intervalo de tiempo en que se llama a la función, debe de estar en milisegundos.
 * `GSourceFunc función`: Función a llamar.
Línea 44: Línea 55:
`guint g_idle_add (GSourceFunc function gpointer data);` [[Anchor(g_idle_add)]]
{{{
guint g_idle_add (GSourceFunc función, gpointer data);
}}}
Línea 48: Línea 62:
 * `GSourceFunc function`: Función a llamar.  * `GSourceFunc función`: Función a llamar.
Línea 52: Línea 66:
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. 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.
Línea 54: Línea 68:
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:

`gboolean Funcion_a_llamar (gpointer data);`
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:
{{{
gboolean función_a_llamar (gpointer data);
}}}
Línea 60: Línea 75:
Veamos un ejemplo de la forma de utilizar la función ''g_timeout_add'' . '''Ejemplo 6-6.1. Veamos un ejemplo de la forma de utilizar la función ''g_timeout_add''.'''
Línea 64: Línea 79:
gboolean func(gpointer data); gboolean nuestra_función(gpointer data);
Línea 74: Línea 89:
        b = g_timeout_add(i, func, bucle);         b = g_timeout_add(i, nuestra_función, bucle);
Línea 80: Línea 95:
gboolean func(gpointer data) gboolean nuestra_función(gpointer data)

Bucles de ejecución

TableOfContents()

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.

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.

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

  • Primero creamos la variable GMainloop

    GMainLoop *bucle;
  • Luego creamos el bucle
    bucle = g_main_loop_new(NULL, FALSE);
  • Finalmente corremos el bucle

    Anchor(g_main_loop_run)

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

    Anchor(g_main_loop_quit)

     g_main_loop_quit (bucle);

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].

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 intervalo, GSourceFunc función, gpointer data);

Veamos los parámetros de esta función:

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

  • GSourceFunc función: Función a llamar.

  • gpointer data: Dato que se pasa a la función como parametro.

  • Retorno: El id del evento origen.

Tiempos de inactividad.

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:

Anchor(g_idle_add)

guint g_idle_add (GSourceFunc función, gpointer data);

Veamos los parámetros de esta función:

  • GSourceFunc función: Función a llamar.

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

  • Retorno: El id del evento origen.

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.

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:

gboolean función_a_llamar (gpointer data);

Asi la función es llamada en varias ocaciones hasta que devuelve FLASE 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 nuestra_función(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, nuestra_función, bucle);
  14         g_main_loop_run(bucle);
  15         g_print("Ya salimos del bucle.\n");
  16         return 0;
  17 }
  18 
  19 gboolean nuestra_función(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)