Системная функция Matlab с исполняемым файлом C - PullRequest
0 голосов
/ 10 ноября 2011

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

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

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

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

Редактировать: я ищу решение в Windows.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

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

Первый - просто использовать сокеты для связи между ними.Вот чистая реализация сокета Matlab, но под капотом она использует Си сокеты.Прошло 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

1 голос
/ 10 ноября 2011

Я нашел решение.Благодарность достается Ричарду Алкоку из 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  

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...