Системная функция 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 для управления вашим приложением). Именно так я в последнее время проводил большинство таких взаимодействий, и это работает очень хорошо.