Matlab系统函数,带有C可执行文件

Matlab系统函数,带有C可执行文件,c,matlab,system,C,Matlab,System,我已经为我的C程序编写了一个MatlabGUI。我曾考虑过使用MEX,但C文件太多,C程序需要一个DLL才能运行 因此,我使用Matlab系统函数调用带有输入的可执行文件,类似于[status results]=System('executable“input 1”“input 2'),运行良好,但我需要实时输出结果只是程序完成程度的百分比输出,我想将此输出用于Matlab中的GUI进度条 输出确实会存储到结果中,但只有在程序完成后才会存储。因此,使进度条变得毫无意义 是否可以让可执行文件一次向

我已经为我的C程序编写了一个MatlabGUI。我曾考虑过使用MEX,但C文件太多,C程序需要一个DLL才能运行

因此,我使用Matlab系统函数调用带有输入的可执行文件,类似于
[status results]=System('executable“input 1”“input 2')
,运行良好,但我需要实时输出<代码>结果只是程序完成程度的百分比输出,我想将此输出用于Matlab中的GUI进度条

输出确实会存储到
结果中
,但只有在程序完成后才会存储。因此,使进度条变得毫无意义

是否可以让可执行文件一次向Matlab发送一个输出,然后让Matlab更新进度条并返回到可执行文件


编辑:我正在Windows中寻找解决方案。

我只看到两个选项,都不适合您当前的实现方法

第一种方法是使用套接字在两者之间进行通信。这是一个纯粹的matlab套接字实现,但实际上它使用的是C套接字。我做C/Java套接字通信已经10年了,但我记得当时有一些问题

另一种选择是通过matlab的C DLL访问可执行文件,并直接从matlab调用DLL(即让matlab控制你的应用程序)。这是我最近进行大多数此类互动的方式,而且效果非常好


我只看到两种选择,都不适合您当前的实施方法

第一种方法是使用套接字在两者之间进行通信。这是一个纯粹的matlab套接字实现,但实际上它使用的是C套接字。我做C/Java套接字通信已经10年了,但我记得当时有一些问题

另一种选择是通过matlab的C DLL访问可执行文件,并直接从matlab调用DLL(即让matlab控制你的应用程序)。这是我最近进行大多数此类互动的方式,而且效果非常好

具体来说,对于我的解决方案:

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  
注意:此代码不支持可执行文件。可执行文件必须在该代码完成之前完成,否则,当它超过可执行文件时,该代码将崩溃。

具体来说,对于我的解决方案:

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  

注意:此代码不支持可执行文件。可执行文件必须在代码完成之前完成,否则当代码超过可执行文件时会崩溃。

我不理解你的所有问题,因为我对Matlab不是很熟悉。但是,你是否考虑过使用?我没有考虑过ScLabb。我希望我能选择我可以编程的环境,但这不是我的选择。谢谢你的链接。一个简单得多的实现是让可执行文件编写一个文件,文件名报告完成状态,然后Matlab每隔一秒左右读取一次文件名。@Jonas,的确更简单,尽管听起来不是很优雅或高效。我可以想象,创建和销毁文件的成本要比从命令行读取文件的成本高得多(如果可能的话)。如果我感到绝望,我想我会这么做。我不理解你所有的问题,因为我对Matlab不是很熟悉。但是,你是否考虑过使用?我没有考虑过ScLabb。我希望我能选择我可以编程的环境,但这不是我的选择。谢谢你的链接。一个简单得多的实现是让可执行文件编写一个文件,文件名报告完成状态,然后Matlab每隔一秒左右读取一次文件名。@Jonas,的确更简单,尽管听起来不是很优雅或高效。我可以想象,创建和销毁文件的成本要比从命令行读取文件的成本高得多(如果可能的话)。如果我感到绝望,我想我会这么做。请在查看解决方案,您可能会感兴趣。谢谢你的回答。我已经有一段时间没有关注Java世界了,所以我忘了你有一个完整的JVM供你使用。这是一个很酷的链接!谢谢。请访问查看解决方案,您可能会感兴趣。谢谢你的回答。我已经有一段时间没有关注Java世界了,所以我忘了你有一个完整的JVM供你使用。这是一个很酷的链接!谢谢