2013-08-07 23 views
2

我可以用Matlab來調用系統功能如下:使用MATLAB異步調用系統功能在後臺

system('dir'); 

這顯示在MATLAB的標準輸出結果和運行同步。

我可以通過使用捕獲的可變輸出:

[status,stdout] = dos('dir'); 

這將顯示無輸出,但仍運行同步。

我可以通過運行該腳本異步;

system('dir &'); 

這會彈出一個命令窗口,然後在前臺運行並在功能完成時保持打開狀態。

想怎麼辦在後臺異步運行命令,並在結束時關閉。有沒有辦法做到這一點?

我在Windows 7上

+0

你可以用批處理文件來做到這一點。 –

+0

@m_power同意 - 這應該工作。我想知道是否有更清晰的方式比matlab調用批處理文件來調用另一個命令 – Joe

+0

你有什麼具體的用例? 'dir'看起來像一個玩具的例子。不同的情況可能需要不同的機制爲什麼你需要異步行爲?這是一個長期運行的過程嗎?你在背景中是什麼意思?沒有可見的命令窗口?還是在其他窗戶後面? (在Unix中,'background'有沒有直接的Windows相當於一個特定的含義。) –

回答

4

嘗試使用Windows start命令,並得到了新的過程是如何推出更好的控制。它將啓動一個新的流程並返回。例如:

[status,out] = system('start /b /min myprogram.exe'); 

如果start選項是不夠的,你可以使用Java java.lang.Process或.NET System.Diagnostics.Process類更直接地從代碼啓動一個進程。兩者都可以直接從Matlab代碼調用,並允許您啓動一個新進程,讓它異步運行,並檢查其狀態。基本上,這是Matlab的system()的替代方案,它可以讓你更精確地控制你正在啓動的進程。特別是,.NET可以讓你指定窗口狀態,是否使用shell來處理命令,等等。和IIRC,Java一個足以啓動一個win32控制檯應用程序(我假設你的exe被編譯爲),而不出現新窗口。

如果你想要做一些與過程附加的監控和互動,並願意寫一些Java代碼,你可以運行在Matlab的嵌入式JVM的一個新的Java工作線程的過程。

2

使用Matlab的Timer對象。它異步運行。您也可以指定退出功能StopFcn

+0

非常感謝! – Joe

+0

@Joe,如果Serg回答你的問題,你會[接受他的回答](http://meta.stackexchange.com/a/5235/192151)? –

+0

您確定這可行嗎? Timer對象異步運行,但是當它過期時,它的回調函數在單線程Matlab解釋器中同步運行,就像GUI回調一樣 - 它會暫停執行任何名爲「pause」或「drawnow」的操作,或者可能餓死。可能不適合長時間運行的任務。 (這在Matlab文檔中並不是非常明確,但http://www.mathworks.com/help/matlab/matlab_prog/using-a-matlab-timer-object.html在「註釋」邊欄中提到了它。 )因此,如果你在做'dos('dir')',它將不會「在後臺」。 –