正如标题所暗示的,我希望能够在使用 RGtk2 创建的 GUI 中异步运行函数。
该函数本身是系统命令的 R 包装器,因此大部分处理时间用于 system() 调用,处理时间可以从 10 分钟到一个小时不等。我希望 GUI 在那个时期仍然能够响应。
由于现在该函数被放入 gSignalConnect(GtkButton, 'clicked') 中,因此 GUI 的其余部分没有响应,直到 'clicked' 信号终止。
有人知道这是否可能吗?
最好的托马斯
正如标题所暗示的,我希望能够在使用 RGtk2 创建的 GUI 中异步运行函数。
该函数本身是系统命令的 R 包装器,因此大部分处理时间用于 system() 调用,处理时间可以从 10 分钟到一个小时不等。我希望 GUI 在那个时期仍然能够响应。
由于现在该函数被放入 gSignalConnect(GtkButton, 'clicked') 中,因此 GUI 的其余部分没有响应,直到 'clicked' 信号终止。
有人知道这是否可能吗?
最好的托马斯
可能有更直接的方法,但我认为你可以这样做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'))
什么可能有效(尽管没有经过测试,而且我对 RGtk 不太熟悉,所以不能保证)是在调用中使用该wait=FALSE
选项。system
然后异步执行系统调用。在您的 gtk GUI 中,您必须定期检查您的系统调用是否已完成。我相信使用 RGtk 可以使用定期调用的函数(从RGtk 的文档中这可能是gtkTimeoutAdd()
)。