Hi,

Le 20/04/2013 18:10, Kip Warner a écrit :
> Hey list,
> 
> I have a separate thread from the main loop that performs some long and
> resource intensive operation. The GUI displays an animated GIF while
> this process takes place via Gdk.PixbufAnimation. 
> 
> Sometimes the animation and the rest of the GUI is very slow to repaint
> and respond to other event messages. What is the best way of giving the
> message pipeline a breather every now and then from outside of the main
> thread?

Just never do something time consuming in the main loop thread.  If you
don't there should not be any lag.  And to communicate with the main
loop from another thread, the common technique is to add an idle handler
(that runs only once).  The GLib main loop is thread safe so you can
simply call g_idle_add() from the worker thread.

> I was using GObject.idle_add(self._updateGUI, ...) within the worker
> thread to specify a function to be called regularly that could provide
> some other GUI related update tasks, including the following within
> it...
> 
>         # Pump the Gtk+ event handler...
>         while Gtk.events_pending():
>             Gtk.main_iteration()

That's a bad idea.  Forcing flush of pending events never is a real
solution, since at most it will perform everything that was queued, but
certainly not what will come.  And as you see yourself, it doesn't work
that well anyway.

> However, my application will crash if I do this with a stack overflow
> within updateGUI. I'm assuming that since idle_add posted the message to
> call the updateGUI callback, when the callback is invoked and tries to
> pump the message pipeline, the method is invoked again because it still
> hasn't cleared itself from the queue.

That's weird, but yeah, since main_iteration() tells the main loop to
perform an iteration and you do this from an idle event I could imagine
your idle event calls itself recursively.  Again, just never use this
"workaround" method of forcing main loop iterations.

> I could have tried this aforementioned event pump from outside the
> updateGUI callback and done it from within the worker thread, but I
> didn't know if that was thread safe to do.

I think the main loop is completely thread safe, event with this, but
again *do not do this*.  If the even loop freezes, it's that you do too
much work in it's thread, nothing else.  Check what you do in the main
thread and that takes time, and try either optimizing it or movie it to
another thread.
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to