由於標題暗示我希望能夠在使用RGtk2創建的GUI中運行異步函數。如何使用RGtk2運行異步函數
該函數本身是一個系統命令的R包裝器,因此大部分處理時間用於system()調用,處理時間的範圍可以從10分鐘到1小時不等。我希望GUI在那個時期仍然能夠做出反應。
由於現在函數被放入gSignalConnect(GtkButton,'clicked'),其餘的GUI因此無響應,直到'clicked'信號被終止。
有沒有人有關於這是否可能的想法?
最好 托馬斯
由於標題暗示我希望能夠在使用RGtk2創建的GUI中運行異步函數。如何使用RGtk2運行異步函數
該函數本身是一個系統命令的R包裝器,因此大部分處理時間用於system()調用,處理時間的範圍可以從10分鐘到1小時不等。我希望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來定期調用函數(從documentation of RGtk這可能是gtkTimeoutAdd()
)。
我想到這個問題,但我仍然需要一個功能在後臺運行,檢查完成,所以我實際上留下了同樣的問題......再加上'wait = FALSE'在一些系統上不時出現問題。 'gtkTimeoutAdd()'是缺失的部分。 – ThomasP85 2013-02-15 14:56:19