Системная функция Matlab с исполняемым файлом C

Я написал графический интерфейс Matlab для моей программы на Си. Я думал об использовании MEX, но там слишком много C-файлов, и для запуска C-программы требуется DLL.

Итак, вместо этого у меня есть системная функция Matlab, вызывающая исполняемый файл с входными данными, что-то вроде [status results] = system('executable "input 1" "input 2"'), который работает хорошо, но я хочу в режиме реального времени вывод. results это просто вывод в процентах от того, насколько завершена программа, и я хочу использовать этот вывод для индикатора выполнения графического интерфейса в Matlab.

Вывод сохраняется в results, но только после завершения программы. Таким образом, делать индикатор прогресса бессмысленным.

Можно ли заставить исполняемый файл отправлять выходные данные по одному в Matlab, а затем заставить Matlab обновить индикатор выполнения и вернуться к исполняемому файлу?

Изменить: я ищу решение в Windows.

2 ответа

Решение

Я нашел решение. Кредит идет на Ричарда Алкока в Центральном 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  

Примечание: этот код не поддерживает исполняемый файл. Исполняемый файл должен завершиться до завершения этого кода, в противном случае этот код вылетает, когда он опережает исполняемый файл.

Я вижу только два варианта, и ни один из них не подходит прямо к вашему текущему подходу к реализации.

Во-первых, просто использовать сокеты для связи между ними. Вот чистая реализация сокета matlab, но под капотом она использует сокеты C. Прошло 10 лет с тех пор, как я работал с сокетами C / Java, но я помню, что в то время были некоторые проблемы.

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

Другой вариант - сделать так, чтобы ваш исполняемый файл был доступен через C DLL из matlab, и вызывать DLL напрямую из matlab (т.е. иметь matlab для управления вашим приложением). Именно так я в последнее время проводил большинство таких взаимодействий, и это работает очень хорошо.

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

Другие вопросы по тегам