我正在尝试将 gtkProgressBar
添加到我为 R 脚本创建的小界面(使用 RGtk2
包)。
如果我做一些简单的事情,比如:
for (i in 1:50)
{
gtkProgressBarSetFraction(progress, i/50)
Sys.sleep(1)
}
一切运行顺利,栏每秒更新一次。
但是,当我转到我的实际代码时,我有一个循环,我在其中执行类似的操作
for(i in 1:1000)
{
gtkProgressBarSetFraction(progress, i/1000)
#do some heavy computation here
}
这里的问题是界面“卡住”并且进度条仅在循环结束时更新,因此完全无法使用...
我在这里遗漏了什么吗?如何定期“唤醒”界面以使其刷新?
谢谢 妮可
编辑:好的,我解决了问题,但我仍然不明白发生了什么。我在 gtkProgressBarSetFraction
之后添加了一个 Sys.sleep
调用,现在界面更新愉快。为了减少“浪费时间”,我只是做了 Sys.sleep(0.0001)
(所以对于 1000 个周期,我只会多出约 0.1-1 秒的计算时间,这是可以接受的)。任何人都可以解释为什么会发生这种情况?
最佳答案
处理一个事件:gtkMainIterationDo(FALSE)
。处理所有未决事件:while(gtkEventsPending()) gtkMainIteration()
.
由于 R 和 Gtk 事件循环交互的方式,需要此代码 - 在每一点,R 或 Gtk 都处于控制之中,并且需要手动将控制权移交给另一个。 Sys.sleep
是一种方法,这些 RGtk2 特定功能是另一种方法。
关于r - RGtk2 中的 gtkProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3820402/