On Fri, 2013-06-14 at 15:08 +0900, Tristan Van Berkom wrote:
> On Fri, Jun 14, 2013 at 8:28 AM, Kip Warner <k...@thevertigo.com> wrote:
> > On Thu, 2013-06-13 at 08:59 +0100, jcup...@gmail.com wrote:
> >> Hi Kip,
> >
> > Hey John,
> >
> >> There are two easy ways to do a long operation in Python.
> >>
> >> First, with idle_add(). Your callback should run for no more than 50ms
> >> or so before returning. If you need to do more work than that, just
> >> wait to be called again. Do not process events, you can leave that up
> >> to the main loop. This style is handy for non-blocking, background
> >> tasks that don't need interaction from the user.
> >
> > Ok, fair enough. I didn't know idle callbacks were intended to be used
> > only for fast non-blocking tasks.
> >
> >> Secondly, with a regular loop that takes control for a long period.
> >> You can keep the GUI alive by processing events, as you say above.
> >> This style is better for modal actions that either block the GUI or
> >> may require interaction.
> >
> > So as I mentioned I tried abandoning the idle_add() approach and instead
> > relied on calling the worker function directly.
> >
> >> It sounds like you have done both at the same time, which seems
> >> confusing to me. I'd make a pure 2) one. If the GUI doesn't refresh,
> >> you probably have a bug in your code somewhere.
> >
> > I do this by calling the long job function directly from within the
> > GtkAssistant's "prepare" signal callback immediately. The problem is
> > that the GUI doesn't refresh throughout the duration of the long job,
> > even though I do explicitly pump the message queue by calling
> > _updateGUI() method regularly:
> 
> Kip,
>    Let me try to illustrate what you need to do to make this work.
> 
> What you currently have is:
> ~~~~~~~~~~~~~~~~~~~~~
> 
> prepare_signal_callback ()
> {
>     /* Update the GUI and flush the event queue, only once, at the
> beginning of your operation */
>     while (gtk_events_pending())
>         gtk_main_iteration_do ();
> 
> 
>     /* Process some data that takes a long time, without ever again
> updating the GUI */
>     while (there_is_data)
>         process_data();
> }

Hey Tristan. I see what you mean, but I think I should have provided
more code to show that what I was actually doing I think was what your
followup suggestion was. Namely do some short work, update the GUI, do
some more short work, repeat.

    <http://pastebin.com/DzrT7Fa7>

So line 140 is the "prepare" signal callback which calls the long job
startDiscVerification(). The latter is a long job which repeatedly calls
_calculateChecksum(). But during each call to the latter,  _updateGUI()
is called which pumps the message queue.

-- 
Kip Warner -- Software Engineer
OpenPGP encrypted/signed mail preferred
http://www.thevertigo.com
_______________________________________________
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