2013-07-15 32 views
2

說我的可執行文件是c:\my irectory\myfile.exe和我的[R腳本調用此executeable與system(myfile.exe)殺死一計算程序後,R中的用戶定義的時間

將R腳本給參數,使用它們做數值計算的可執行程序。從可執行文件的輸出中,R腳本然後測試參數是否合理。如果它們不好,則參數會更改,並且可執行文件會重新運行更新的參數。現在

,因爲該可執行文件進行數學計算和解決方案可以會聚只有慢慢地我希望能夠殺死可執行一旦需要長期進行計算(比如5秒)

怎麼辦我這次是否依賴殺人?

PS: 我的問題是有點與此相關的一個:(時間不依賴殺) how to run an executable file and then later kill or terminate the same process with R in Windows

回答

2

您可以將代碼添加到它發出的可執行文件調用您的R功能:

setTimeLimit(經過= 5,trans = T)

這將殺死調用函數,將控制返回到父環境(這也可能是一個函數)。然後使用您鏈接的問題中的示例進行進一步的工作。

或者,建立一個檢查Sys.time的循環,如果在5秒後沒有發生對參數集的預期更新,則打破循環併發出系統kill命令以終止myfile.exe

+0

這是一個有效的答案,只要我相信,但帶來了另一個問題: 你有等待'elapse = 5'中指定的時間,直到您可以繼續執行下一段代碼。只有在指定的經過時間R取消與可執行計算程序(和輸入/輸出)文件的連接後。 而您需要重複執行此斷開連接。 我已經開始嘗試在MS-DOS端。 – Toby

+0

Add。信息:剛剛使用R.utils軟件包 'evalWithTimeout(runHYDRUS(),timeout = 0)中的以下函數嘗試了它。1,onTimeout =「warning」)' 我有同樣的問題,我不能從可執行程序斷開連接。即所有輸入/輸出文件仍然「打開」。 – Toby

+0

@TobyElTejedor我以爲你想等待,以確保你在繼續之前有有效的更新?你打算優先考慮的方案是什麼(即R代碼是否在等待'myfile.exe'或不是並行R-任務?)。對你的第二個評論:R內的超時只停止R函數。您需要以這種或那種方式「觀察」超時併發出系統命令來終止可執行文件。 –

0

可能有更好的方法,但它是一個解決方案。

假設這裏就是,myfile.exe成功執行其5秒

try.wtl <- function(timeout = 5) 
{ 
     y <- evalWithTimeout(system(myfile.exe), timeout = timeout, onTimeout= "warning") 
     if(inherits(y, "try-error")) NA else y 
} 

殼體1(myfile.exe被全成計算之後關閉)

g <- try.wtl(5) 

殼體2內的計算(MYFILE .exe是不是成功計算後關閉)

g <- try.wtl(0.1) 

的情況下,需要2個MSDOS的taskkill從beginnging

if (class(g) == "NULL") {system('taskkill /im "myfile.exe" /f',show.output.on.console = FALSE)} 

PS重新開始:靈感來自Time out an R command via something like try()

+1

請注意,這需要R.utils包。 –