Just to throw the idea out there:
You can use a hybrid between idle_add & threads.
I built a gui with threads that build a data structure, and invoke
callbacks on an update queue thread that mostly sleeps, but occasionally
wakes up and checks for pending updates. If there are updates pending, it
invokes a callback on the main (gui) class. Since I occasionally got weird
lock-ups having the update thread invoke a callback that calls gtk methods
in another thread (I think because it doesn't actually get executed in that
other thread), I just have the update thread invoke a callback that updates
a flag in the gui (gtk) thread, and use a gtk idle func (via idle_add) that
checks the update flag, and updates the gui as necessary.
A bit intricate, I guess, but it works, no lock-ups, and the gui updates
nicely.
The only real catch to pygtk, threads, and python, is that pythons thread
management is .. lacking. There is no real way to signal threads to
shutdown. So if someone closes the gui, the best you can do is invoke a
callback on the other thread that updates a flag, they hopefully check that
in time to shutdown before the gui closes and/or you exit python. This can
be problematic if your background threads do computationally intense stuff
and don't necessarily check their "die" flag in time.
Just a few thoughts...
-Stu
From: Thomas Güttler <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Subject: Re: [pygtk] PyGTK Thread problem
Date: Fri, 13 Apr 2007 08:51:10 +0200
Am Donnerstag, 12. April 2007 18:32 schrieb Rodrigo Uroz:
> Regarding this, another problem. Now I get my thread to update the GUI
> through a callback in my main thread, but the TextView gets updated only
> the first time, then the callback gets called again and again but
doesn't
> automatically update the GUI (I have to click in the TextView to update
> it).
>
> What could be going wrong?, I couldn't find a solution looking in the
mail
> list.
>
Is your main thread busy? Updates only happen after the main thread
returns from the callback.
BTW: I switched from threads to idle_add. It is much easier to debug.
http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq03.007.htp
"""
3.7. While my callback is executing, nothing is refreshed in the
application
windows!
If you have a long-running callback, or one that modifies the application
windows during its execution, you will notice that the windows of your app
freeze for the duration of the callback. This is by design: all gtk events
(including window refreshing and updates) are handled in the mainloop, and
while it has branched to process your callback, it can't handle window
update
events.Therefore nothing will happen in the application windows.
The trick here is to realize where your callback can take a while to
return,
or where it is dynamically changing the window contents, and add a section
like this in the body of your callback handler:
while gtk.events_pending():
gtk.main_iteration(False
"""
--
Thomas Güttler, http://www.tbz-pariv.de/
Bernsdorfer Str. 210-212, 09126 Chemnitz, Tel.: 0371/5347-917
_______________________________________________
pygtk mailing list [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
_________________________________________________________________
Get a FREE Web site, company branded e-mail and more from Microsoft Office
Live! http://clk.atdmt.com/MRT/go/mcrssaub0050001411mrt/direct/01/
_______________________________________________
pygtk mailing list [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/