I am trying to add a gtkProgressBar to a little interface I created for an R script (using the RGtk2 package).
If I do something simple, as:
for (i in 1:50)
{
gtkProgressBarSetFraction(progress, i/50)
Sys.sleep(1)
}
everything runs smoothly and the bar is updated every second.
However, when I go to my actual code, I have a loop in which I do something like
for(i in 1:1000)
{
gtkProgressBarSetFraction(progress, i/1000)
#do some heavy computation here
}
The problem here is that the interface “freezes” and the progress bar is only updated at the end of the loop, therefore defeating completely its use…
Am I missing something here? How can I periodically “wake up” the interface so that it refreshes?
Thank you
nico
EDIT: OK, I solved the problem, but I still don’t understand what is going on. I added a Sys.sleep call after the gtkProgressBarSetFraction and now the interface updates happily. To reduce “wasted time” I just did Sys.sleep(0.0001) (so for 1000 cycles I would only have ~0.1-1s more computing time, which is acceptable). Anyone could explain why is this happening?
To process one event:
gtkMainIterationDo(FALSE). To process all pending events:while(gtkEventsPending()) gtkMainIteration().This code is needed because of the way that the R and Gtk event loops interact – at every point, either R or Gtk is in control, and needs to manually hand off control to the other.
Sys.sleepis one way of doing that, and these RGtk2 specific functions are another.