[Gtk-sharp-list] Force UI Update?

Michael Hutchinson m.j.hutchinson at gmail.com
Mon May 2 10:03:26 EDT 2011


On Sun, May 1, 2011 at 4:29 PM, Jim Orcheson <jim at va3hj.ca> wrote:
> I have a Gtk# application where the processing of a menu item may take
> many seconds. I want to change the cursor to a Watch before the actual
> processing takes place, and then change the cursor back to Arrow when
> done. For example:
>
> OnMenuItem(...)
> {
>     DoSetupProcessing();
>     this.GdkWindow.Cursor = new Gdk.Cursor(Gdk.CursorType.Watch);
>     DoLongProcessing();
>     this.GdkWindow.Cursor = new Gdk.Cursor(Gdk.CursorType.Arrow);
> }
>
> With this code the watch cursor is never displayed because UI updating
> normally only occurs during idle processing, which of course does not
> occur until after OnMenuItem returns.
>
> Is there a way to force the update to display the watch cursor without
> DoLongProcessing using a separate thread?

You could manually flush the UI event queue with
while (Gtk.Application.EventsPending ())
        Gtk.Application.RunIteration ();
but your processing code will still be blocking the UI thread while
you're doing your processing, so if anything gets invalidated by an
external source it won't redraw.

For a good user experience, you should really do the processing in a
thread, and probably show a modal dialog with a progress bar and a
cancel button. Your processing thread can update the progress bar
using Gtk.Application.Invoke to touch the UI thread.

http://www.mono-project.com/Responsive_Applications

-- 
Michael Hutchinson
http://mjhutchinson.com


More information about the Gtk-sharp-list mailing list