我为我的C程序编写了一个Matlab GUI。我想过使用MEX,但是有太多的C文件和C程序需要运行DLL。
所以,相反,我有Matlab系统函数调用带有输入的可执行文件,类似[status results] = system('executable "input 1" "input 2"')
,运行良好,但我想要实时输出。 results
只是程序完成程度的百分比输出,我想将此输出用于Matlab中的GUI进度条。
输出确实存储在results
中,但仅在程序完成后才存储。因此,使进度条毫无意义。
是否可以让可执行文件一次一个地发送输出到Matlab,然后让Matlab更新进度条,然后返回可执行文件?
编辑:我正在寻找Windows中的解决方案。
答案 0 :(得分:2)
我只看到两个选项,并且都不直接适合您当前的实现方法。
首先,只是使用套接字在两者之间进行通信。这是一个纯粹的matlab套接字实现,但在引擎盖下它使用的是C套接字。我做C / Java套接字通信已经10年了,但我记得当时有一些问题。
http://www.mathworks.com/matlabcentral/fileexchange/21131-tcpip-socket-communications-in-matlab
另一种选择是通过matlab中的C DLL访问您的可执行文件,并直接从matlab调用DLL(即让matlab控制您的应用程序)。这是我最近进行大多数此类交互的方式,而且效果非常好。
答案 1 :(得分: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
注意:此代码不会阻止可执行文件。可执行文件必须在此代码完成之前完成,否则此代码会在它超出可执行文件时崩溃。