On Sun, 2009-01-25 at 02:57 +0100, Lionel Dricot wrote: > Hello, > > I'm displaying a TreeStore in a TreeView and I want to refresh them > when I receive the gobject signal "refresh". > > Because my refresh can be heavy and I don't want to refresh 10 times > when not needed, the refresh is handled in a thread. The principle is > the following :
Simple, Gtk is not threadsafe! Do not touch the GUI from the non main thread (unless you acquire the gtk lock) Advice on handling Threads with (py)Gtk can be found http://faq.pygtk.org/index.py?req=show&file=faq20.001.htp http://www.johnstowers.co.nz/blog/index.php/2007/03/12/threading-and-pygtk/ http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html http://www.oreillynet.com/onlamp/blog/2006/07/pygtk_and_threading.html John > > SignalEmitter.connect("refresh",self.do_refresh) > > do_refresh() > thread(self.general_refresh) > > general_refresh() > if self.lock.acquire(False) : > refresh_treestore() > self.lock.release() > > refresh_treestore() : > At first, I was emptying the TreeStore then added the elements but > I've seen somewhere on the web that it might be better to create a new > TreeStore then to set_model on the TreeView > > > Unfortunatly, it crashes randomly with the error : > > /home/ploum/code/gtg/taskbrowser/browser.py:180: GtkWarning: > gtk_tree_store_get_value: assertion `VALID_ITER (iter, tree_store)' > failed > gtk.main() > /home/ploum/code/gtg/taskbrowser/browser.py:180: Warning: > g_object_set_property: assertion `G_IS_VALUE (value)' failed > gtk.main() > /home/ploum/code/gtg/taskbrowser/browser.py:180: Warning: > g_value_unset: assertion `G_IS_VALUE (value)' failed > gtk.main() > > The crash can happen at start, it can happen after 10 minutes, it's > completely random. Also, the crash always happens after the lock is > released. > > I've no idea why it crashes like this and any help would be greatly > appreciated ! > > > If you are motivated enough to try the real code, I've put a bzr > branch on https://code.edge.launchpad.net/~gtg/gtg/threaded. simply > do : > > bzr branch lp:~gtg/gtg/threaded > > The code is in taskbrowser/browser.py (refresh_treestore is called > refresh_ts). > > (and if you want to see the application in its normal shape, just do > bzr branch lp:gtg ) > > Thanks a lot for your (future) help, > > Lionel > _______________________________________________ > pygtk mailing list [email protected] > http://www.daa.com.au/mailman/listinfo/pygtk > Read the PyGTK FAQ: http://faq.pygtk.org/ _______________________________________________ pygtk mailing list [email protected] http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/
