[Gtk-sharp-list] Updating of a window not done right away

Michael Hutchinson m.j.hutchinson at gmail.com
Fri Sep 26 14:08:43 EDT 2008


On Fri, Sep 26, 2008 at 3:31 AM, Mathias Tausig <mtausig at fsmat.at> wrote:
> Am 25. Sep 2008 um 08:14:03 -0400, schrieb Adam Tauno Williams:
>> On Thu, 2008-09-25 at 09:49 +0200, Mathias Tausig wrote:
>> > Am 24. Sep 2008 um 16:50:02 -0300, schrieb Pedro Guridi:
>> > >    I'm not sure if we are talking about the same thing.
>> > >    But what I'm saying, it's for the case when you have a long operation, or
>> > >    some long while/for, and because of that the gtk main loop will
>> > >    not be able to update the gui, or receive any event until the loop ends.
>> > >    To solve that you can add this inside the blocking loop (assuming that
>> > >    runs in the main thread than Gtk, that's the point after all) :
>> > >  while (Gtk.Application.EventsPending ())
>> > >          Gtk.Application.RunIteration ();
>> > Look at my code snippet in my inititial mail. That's exaclty what I am doing in my DisplayPanel class, whenever I change the text. That's why I consider this behaviour to be so weird
>> > >    Question.., I guess you are using these: "Thread.Sleep(3000)" for giving
>> > >    the gtk main thread a time to update the gui, I'm right?.
>> > >    if this is the case, try putting the code above instead of the
>> > >    "Thread.Sleep(3000);".
>> > The Thread.Sleep only exists in this short example function. In reality, a longish and blocking function (a pinpad verification of a smartcard) is executed.
>>
>> I haven't looked at the code in question, but rather than messing with
>> the loop wouldn't it be easier to put the pinpad verification into a
>> background thread and notify the main thread when success/failure
>> occurs?
>
> Maybe this would work. But I actually do want to understand, what the problem is here.

Any operation in the GTK thread will block the GTK main loop until it
completes. If you expect an operation to take more than a few hundred
milliseconds, it should be performed asynchronously in another thread.

Your sample is clearly sleeping the GTK thread for 3 seconds. In these
three seconds, it cannot render. Clearing the event queue beforehand
doesn't change the fact that you're blocking it.

The code snippet
while (Gtk.Application.EventsPending ())
   Gtk.Application.RunIteration ();
is useful for clearing the event queue periodically from inside a
long-running loop. Nonetheless, if you do use this technique, you
should ensure that your outer loop hits this at a minimum of every few
hundred milliseconds for your application to remain responsive


-- 
Michael Hutchinson
http://mjhutchinson.com


More information about the Gtk-sharp-list mailing list