[Python-es] Problema congelación PyGTK

Arnau Sanchez pyarnau en gmail.com
Vie Ago 6 14:47:36 CEST 2010


On Thu, 5 Aug 2010 21:42:31 -0400 Milton Galo Patricio Inostroza
Aguilera wrote:

> Disculpa por haberte respondido de esta manera, pero realmente estoy
> corto de tiempo.
> 
> [1]  http://acinfo.unap.cl/minostro/pyGTK/copia_archivo.tar.gz

A mi me da un 404.

El día 5 de agosto de 2010 17:19, alfonso saavedra <n4e03 en yahoo.es>
escribió:

> Aquí os dejo las lineas y pongo en negrita la función que se
> encarga de hacer la busqueda:
>
> if gobject.idle_add(task.next):
>            pass
>
>     def buscar(self):
>         self.model.clear()
>         nearby_devices = bluetooth.discover_devices()
>         for bdaddr in nearby_devices:
>             mac =  bdaddr
>             name = bluetooth.lookup_name(mac)
>             self.model.append((name, mac))
>             yield True
>         yield False

Eso de usar gobject.idle_add + generador como forma de pseudo-threading
es una idea ingeniosa (¿lo has encontrado en el pygtk-faq?), pero a la
hora de la verdad es menos útil de lo que parece: sólo tiene sentido
cuando el generador puede hacer "yields" muy a menudo para devolver el
control al bucle de eventos. Aquí por ejemplo imagino que
bluetooth.lookup_name() es una operación costosa, y por eso el GUI
sigue yendo a trompicones. En ese caso no tendrás más remedio que usar
threads. 

No sé si hay una librería genérica (yo al menos no la conozco) para
abstraer threads en pygtk, pero algo hay escrito sobre el tema. Esta
idea por ejemplo está bastante bien:

http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html

Yo mismo escribí hace unos meses un sistema que usa corutinas, en un
intento de conseguir una solución transparente:

http://code.activestate.com/recipes/577129-run-asynchronous-tasks-using-coroutines/

En fin, échale un ojo y a ver si sacas alguna idea.


Más información sobre la lista de distribución Python-es