正如标题所暗示的,我希望能够在使用RGtk2创建的GUI中异步运行函数。
该函数本身是系统命令的R包装器,因此大部分处理时间用于system()调用,处理时间可以从10分钟到1小时不等。我希望GUI能够在那段时间内保持响应。
现在,该功能被置于gSignalConnect(GtkButton,'clicked')中,因此GUI的其余部分无响应,直到'clicked'信号终止。
有没有人知道这是否可行?
最好托马斯
答案 0 :(得分:3)
可能有更直接的方式,但我认为您可以使用gTimeoutAdd
执行此操作:
library(RGtk2)
w <- gtkWindow()
g <- gtkVBox(); w$add(g)
b1 <- gtkButton("Start timer"); g$packStart(b1)
b2 <- gtkButton("click me"); g$packStart(b2)
gSignalConnect(b1, "clicked", function(...) {
id <- gTimeoutAdd(1, function(...) {
Sys.sleep(5) # replace me
message("Okay, I'm up")
FALSE # one shot
})
})
gSignalConnect(b2, "clicked", function(...) message('clicked me'))
答案 1 :(得分:1)
可能有效(虽然未经过测试,我对RGtk不太熟悉,因此无法保证)是使用wait=FALSE
调用中的system
选项。然后异步执行系统调用。在gtk GUI中,您必须定期检查系统调用是否已完成。我相信可以使用RGtk来定期调用函数(来自documentation of RGtk这可能是gtkTimeoutAdd()
)。