2013-02-15 39 views
1

由於標題暗示我希望能夠在使用RGtk2創建的GUI中運行異步函數。如何使用RGtk2運行異步函數

該函數本身是一個系統命令的R包裝器,因此大部分處理時間用於system()調用,處理時間的範圍可以從10分鐘到1小時不等。我希望GUI在那個時期仍然能夠做出反應。

由於現在函數被放入gSignalConnect(GtkButton,'clicked'),其餘的GUI因此無響應,直到'clicked'信號被終止。

有沒有人有關於這是否可能的想法?

最好 托馬斯

回答

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

什麼可能的工作(雖然沒有測試過,我不是太熟悉RGtk所以沒有保證)是使用wait=FALSE選項中system通話。然後系統調用異步執行。在你的gtk GUI中,你必須定期檢查你的系統調用是否完成。我相信有可能使用RGtk來定期調用函數(從documentation of RGtk這可能是gtkTimeoutAdd())。

+0

我想到這個問題,但我仍然需要一個功能在後臺運行,檢查完成,所以我實際上留下了同樣的問題......再加上'wait = FALSE'在一些系統上不時出現問題。 'gtkTimeoutAdd()'是缺失的部分。 – ThomasP85 2013-02-15 14:56:19

相關問題