2011-11-09 57 views
0

我爲我的C程序編寫了一個Matlab GUI。我想過使用MEX,但是有太多的C文件和C程序需要運行一個DLL。具有C可執行文件的Matlab系統函數

所以,相反,我有Matlab系統函數調用與輸入可執行文件,如[status results] = system('executable "input 1" "input 2"'),它運行良好,但我想要實時輸出。 results只是程序完成程度的百分比輸出,我想在Matlab中使用此輸出作爲GUI進度條。

輸出確實存儲在results中,但僅在程序完成後才存儲。因此,使進度條毫無意義。

是否有可能讓可執行文件將輸出一次發送到Matlab,然後讓Matlab更新進度條並返回到可執行文件?

編輯:我正在尋找Windows中的解決方案。

+0

我不明白你所有的問題,因爲我不是很熟悉Matlab。但是,您是否可以考慮使用http://www.scilab.org/? –

+0

我沒有考慮過scilab。我希望我可以選擇我可以編程的環境,但這個選擇不是我的。感謝您的鏈接。 – user1007692

+0

一個簡單得多的實現是讓可執行文件寫一個文件,其名稱報告完成狀態,Matlab每秒鐘讀取文件名。 – Jonas

回答

1

I found a solution. Credit goes to Richard Alcock at Matlab Central

具體來說,我的解決方案:

cmd = {'executable.exe', 'input 1', 'input 2'}; 
processBuilder = java.lang.ProcessBuilder(cmd); 
cmdProcess = processBuilder.start(); 

% Set up a reader to read the output from the command prompt 
reader = 
    java.io.BufferedReader(... 
     java.io.InputStreamReader(... 
      cmdProcess.getInputStream() ... 
     ) ... 
    ); 

% Loop until there is some output 
nextLine = char(reader.readLine); 
while isempty(nextLine) 
    nextLine = char(reader.readLine); 
end 

% Then loop until there is no more output 
while ~isempty(nextLine); 
    fprintf('Output: %s\n', nextLine); 
    nextLine = char(reader.readLine); 
end 

% Get the exit value of the process 
exitValue = cmdProcess.exitValue 

注:此代碼不能撐起可執行文件。該代碼完成之前,可執行文件必須完成,否則當代碼超出可執行文件時,此代碼會崩潰。

2

我只看到兩個選項,兩者都不符合您當前的實施方法。

第一個,就是使用套接字在兩者之間進行通信。這是一個純粹的matlab套接字實現,但是它使用C套接字。我已經完成了C/Java套接字通信已經有10年了,但我記得當時有一些問題。

http://www.mathworks.com/matlabcentral/fileexchange/21131-tcpip-socket-communications-in-matlab

另一種選擇是有可執行經由C DLL可訪問來自MATLAB,並直接從MATLAB調用的DLL(即已經MATLAB控制你的應用程序)。這是我最近一直在做這種交互的方式,而且工作得很好。

http://www.mathworks.com/help/techdoc/ref/loadlibrary.html

+0

請查看http://www.mathworks.com/matlabcentral/answers/4828-reading-from-comand-prompt-executables上的解決方案,它可能會對您有所幫助。儘管感謝您的答案。 – user1007692

+0

我一直未遵循Java世界,所以我忘記了你有一個完整的JVM。這是一個很酷的鏈接!謝謝。 – John

相關問題