[Buoh-dev] Pon un hilo en tu vida!



Buenas, 

hay novedades importantes en el buoh, os cuento:

En la primera versi?n del buoh, cuando un comic se estaba cargando la
lista de comic se deshabilitada, lo cual nos evitaba problemas, pero que
en realidad es un error. Imaginad que alguien tiene una conexi?n lenta y
esta bajando un comic muy pesado. Si no quiere terminar de cargar el
comic y quiere ver otro, tiene que esperar a que el comic est? cargado
del todo para poder seleccionar otro. Lo ideal es que al seleccionar
otro mientras uno se est? cargando, se detenga la carga actual y se
prepare la nueva carga. 

Esto es algo mas complicado de lo que parece cuando solo tenemos un
proceso. Es posible hacerlo mediante g_idle y g_timeout, pero no queda
del todo fluido. Es por ello que he a?adido un hilo que se encarga de la
carga del comic. No os asust?is, que el tema de los hilos como todos
sabemos suele traer problemas dificiles de depurar y corregir, pero si
se hacen las cosas con cuidadito no pasa nada. 

Algunas cosas que hay que saber sobre los hilos y GTK+:

GTK+ no se lleva muy bien con los hilos en general, lo cual no quiere
decir que no podamos usar hilos en nuestra app, solo hay que tener en
cuenta algunas cosas:

* El ?nico hilo que puede tocar el GUI es el hilo principal, es decir,
el proceso principal donde est? ejecutando el bucle de eventos de GTK+

* El resto de hilos pueden acceder a la informaci?n (usando mecanismos
de concurrencia cuando sea necesario) siempre y cuando no toquen el gui,
lo cual incluye tambi?n el env?o de se?ales

* Es posible (en teor?a) permitir a otros hilos tocar el GUI, en el FAQ
de GTK+ viene como hacerlo, pero no es recomendable y no siempre
funciona bien.

Por esto, el modelo que he escogido yo se basa en lo siguiente:

He a?adido un nuevo objeto BuohComicLoader que se encarga de cargar un
comic, es decir, bajarlo de inet, e ir carg?ndolo en un pixbuf_loader.
Este objeto lanza un hilo para realizar estas tareas. 
Para garantizar la fluidez del GUI es necesario controlar el hilo desde
el proceso principal de forma peri?dica, es decir, permitiendo que se
ejecuten eventos dentro del bucle de GTK+. Para ello cada hilo que lanzo
tiene un procedimiento asociado que hace de monitor, que se ejecuta de
forma peri?dica (g_timeout) y que va consultando el estado del hilo y
actualizando el GUI en consecuencia. 

Cuando hay concurrencia hay que tener en cuenta muchas cosas, en nuestro
caso tenemos una secci?n critica principal, el pixbuf. El hilo va
cargando el pixbuf mediante el pixbuf_loader y el monitor lo va
obteniendo y mostrando en el GtkImage. Es un productor-consumidor de los
de toda la vida. Cada vez que accedemos a la secci?n ciritica para
escritura ponemos un cierre. 

El monitor necesita adem?s consultar el estado de la carga, por lo que
tendremos otra secci?n critica asociada al estado. 

Por ?ltimo he usado un cierre mas que garantice que nunca haya mas de un
hilo ejecut?ndose. Puesto que no puede haber dos comics cargandose a la
vez, antes de crear un hilo cojo un cierre, que no ser? liberado hasta
que el hilo termine.

Las situaciones que pueden producirse con la concurrencia son siempre
problem?ticas, por lo que cuanto mas lo probemos mejor, siempre hay un
caso por ah? que sucede una vez de cada 500 que no hab?amos tenido en
cuenta, por lo que es vital que juguemos con ello.

En mi opini?n, el GUI funciona ahora mas fluido, pero en funci?n de las
pruebas que hagamos puede ser necesario cambiar cosas, como por ejemplo,
la periodicidad del monitor del hilo y cosas as?. 

Salu2
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 Carlos Garcia Campos a.k.a. KaL
   elkalmail yahoo es
   carlosgc gnome org
   http://carlosgc.linups.org
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=             
PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://forge.novell.com/pipermail/buoh-dev/attachments/20050731/7e94d44e/attachment.pgp


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]