#c #matlab #system
#c #matlab #система
Вопрос:
Я написал графический интерфейс Matlab для своей программы на C. Я думал об использовании MEX, но файлов на C слишком много, а для запуска программы на C требуется DLL.
Итак, вместо этого у меня есть системная функция Matlab, вызывающая исполняемый файл с входными данными, что-то вроде [status results] = system('executable "input 1" "input 2"')
, которая работает хорошо, но я хочу вывод в реальном времени. results
это всего лишь процентный вывод того, насколько завершена программа, и я хочу использовать этот вывод для индикатора выполнения GUI в Matlab.
Выходные данные сохраняются в results
, но только после завершения программы. Таким образом, индикатор выполнения становится бессмысленным.
Возможно ли заставить исполняемый файл отправлять выходные данные по одному за раз в Matlab, а затем заставить Matlab обновить индикатор выполнения и вернуться к исполняемому файлу?
Редактировать: я ищу решение в Windows.
Комментарии:
1. Я не совсем понимаю ваш вопрос, потому что я не очень знаком с Matlab. Однако, возможно, вы рассматривали возможность использования scilab.org ?
2. Я не рассматривал scilab. Хотел бы я выбрать, в какой среде я мог бы программировать, но этот выбор делать не мне. Хотя спасибо за ссылку.
3. Гораздо более простой реализацией было бы заставить исполняемый файл записывать файл, имя которого сообщает о статусе завершения, и Matlab считывать имя файла каждую секунду или около того.
4. @Jonas, действительно проще, хотя звучит не очень элегантно или эффективно. Я мог бы представить, что затраты на создание и уничтожение файла намного выше, чем на чтение из командной строки (если это вообще возможно). Полагаю, я сделаю это, если буду в отчаянии.
Ответ №1:
Я вижу только два варианта, и ни один из них не соответствует вашему текущему подходу к реализации.
Во-первых, просто использовать сокеты для связи между ними. Вот чистая реализация сокета matlab, но под капотом она использует сокеты C. Прошло 10 лет с тех пор, как я подключался к сокету C / Java, но я помню, что в то время были некоторые проблемы.
http://www.mathworks.com/matlabcentral/fileexchange/21131-tcpip-socket-communications-in-matlab
Другой вариант — сделать ваш исполняемый файл доступным через C DLL из matlab и вызывать DLL непосредственно из matlab (т. Е. позволить matlab управлять вашим приложением). Именно так я выполнял большинство подобных взаимодействий в последнее время, и это работает очень хорошо.
Комментарии:
1. ознакомьтесь с решением на mathworks.com/matlabcentral/answers / … , это может вас заинтересовать. Однако спасибо за ваши ответы.
2. Я некоторое время не следил за миром Java, и поэтому я забыл, что в вашем распоряжении есть целая JVM. Это классная ссылка! Спасибо.
Ответ №2:
Я нашел решение. Заслуга принадлежит Ричарду Алкоку из 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: %sn', nextLine);
nextLine = char( reader.readLine );
end
% Get the exit value of the process
exitValue = cmdProcess.exitValue
Примечание: этот код не поддерживает исполняемый файл. Исполняемый файл должен завершиться до завершения этого кода, в противном случае этот код завершается сбоем, когда он опережает исполняемый файл.