1

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

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

由于现在该函数被放入 gSignalConnect(GtkButton, 'clicked') 中,因此 GUI 的其余部分没有响应,直到 'clicked' 信号终止。

有人知道这是否可能吗?

最好的托马斯

4

2 回答 2

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'))
于 2013-02-15T12:52:23.740 回答
1

什么可能有效(尽管没有经过测试,而且我对 RGtk 不太熟悉,所以不能保证)是在调用中使用该wait=FALSE选项。system然后异步执行系统调用。在您的 gtk GUI 中,您必须定期检查您的系统调用是否已完成。我相信使用 RGtk 可以使用定期调用的函数(从RGtk 的文档中这可能是gtkTimeoutAdd())。

于 2013-02-15T12:50:35.037 回答