我們的實習生myc自從轉正了以後就開始消極怠工,也不發文章了。領導今天終於逮到機會和他促膝長談一番。

領導:myc啊,最近好像也沒見你發文章嗎?

myc:領導有所不知啊,最近事情太多,轉正後要培訓,培訓後公司要出去旅遊,旅遊後奧運又開始了。我們這些做MATLAB的程式設計師都是單執行緒的,一項任務完成了以後才能進行下一項啊。

領導知道myc說的有那麼一定道理,畢竟一個MATLAB語句在沒有結束前是不能簡單的呼叫另一個語句的。但作為多年的老領導,他知道可以用timer或者是Parallel Computing Toolbox來完成非同步或是並行的任務的。他剛想追問,myc就先發制人

myc: 我知道可以用timer object來達到非同步執行程式的效果,可是timer object管理起來麻煩啊。要說Parallel Computing,公司經費緊張,您看是不是也不太合適購買啊?

領導:……

然而領導豈是吃素的

領導:要說你啊,還是too young, too simple。 MATLAB可以呼叫Java, 你知道Java有個東西叫ProcessBuilder嗎?

myc: ……

廢話少說,show me the code:

假設我們有一個可執行程式,在他執行的時候會佔用當前的程序,一個最簡單的例子就是在MATLAB裡呼叫Linux的wget命令去下載一些東西:

>>

system

‘wget -O opencv-2。4。9。zip http://sourceforge。net/projects/opencvlibrary/files/opencv-unix/2。4。9/opencv-2。4。9。zip/download’

% 當前MATLAB會一直呈現Busy狀態

% 直到下載結束

>>

那麼如何讓MATLAB呼叫其它程序的時候不再佔用當前程序的資源呢?

% 呼叫ProcessBuilder

>>

pb

=

java

lang

ProcessBuilder

({

‘wget’

‘-O’

‘opencv-2。4。9。zip’

‘http://sourceforge。net/projects/opencvlibrary/files/opencv-unix/2。4。9/opencv-2。4。9。zip/download’

});

% 重新定向輸出和錯誤記錄

>>

pb

redirectOutput

java

io

File

‘log。txt’

))

>>

pb

redirectError

java

io

File

‘errorlog。txt’

))

% 啟動程序

>>

pb

start

()

% ProcessBuilder會fork出一個新的程序,當前MATLAB可以繼續使用

>>

領導:看到了?這就是如何在MATLAB中非同步呼叫程式

myc: fork my life。。