如何使用RGtk2运行异步函数

时间:2013-02-15 12:24:43

标签: r user-interface asynchronous gtk

正如标题所暗示的,我希望能够在使用RGtk2创建的GUI中异步运行函数。

该函数本身是系统命令的R包装器,因此大部分处理时间用于system()调用,处理时间可以从10分钟到1小时不等。我希望GUI能够在那段时间内保持响应。

现在,该功能被置于gSignalConnect(GtkButton,'clicked')中,因此GUI的其余部分无响应,直到'clicked'信号终止。

有没有人知道这是否可行?

最好

托马斯

2 个答案:

答案 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())。