2013-02-28 4 views
0

У меня есть графический интерфейс основной формы, который генерирует дочерние GUI, которые являются модульными и независимыми от мастера, который его породил, принимая только входные аргументы, но не имеет выходных аргументов или зависимости от данных при выполнении отдельных несвязанных задач ,Параллельная обработка с графическим интерфейсом Matlab

Текущая настройка заключается в том, что нажатием кнопки на главном графическом интерфейсе создается дочерний GUI и выполняется алгоритм с длительным вычислением и будет продолжаться до тех пор, пока не будет завершен, когда графический интерфейс будет уничтожен.

Проблема заключается в том, что мне хотелось бы открыть несколько разных модулей из главного графического интерфейса, когда ребенок уже существует. Например, нажмите кнопку для запуска GUI 1, вернитесь к главному графическому интерфейсу и нажмите еще одну кнопку для запуска GUI 2 и т. Д. Проблема, с которой я сталкиваюсь, заключается в том, что GUI 1 прерывается и удерживается до тех пор, пока GUI 2 не завершит выполнение, тогда GUI 1 вернется с того места, где он остановился, где, как я хотел, чтобы оба они работали одновременно.

EDIT: Я решил свою проблему, оказалось, что есть уродливый способ сделать это, и даже тогда он не появляется в графическом интерфейсе, но делает то, что мне нужно. Просто нужно использовать parfor с итерацией, действующей как индексный номер, чтобы указать Matlab, который функционирует для запуска внутри цикла.

+0

Вы пытались добавить призывы к паузе, как я предложил? Это должно позволить появляться дополнительные окна – grantnz

ответ

0

Вы можете выполнить рудиментарную параллельную обработку, используя команду pause, чтобы выполнить выполнение, но это немного навязчиво, так как ваш длинный алгоритм должен периодически вызывать паузу.

function [ output_args ] = BackgroundTask(srcTimer,~, hObject) 
%BackgroundTask - Test background task 

fprintf(1,'Background\n'); 

end 


hObject = 'Some relevant Object'; 
feedbackTimer = timer('Period',1,'TimerFcn', {@BackgroundTask, hObject}, 'ExecutionMode','FixedRate'); 
start(feedbackTimer); 

Длинный ход задача

fprintf(1,'Start\n'); 
for i=1:200000; factorial(100); 
     if mod(i,1000) == 0 
      pause(0.001); 
     end 
end 
fprintf(1,'Finish\n'); 

Если запустить фоновую задачу, а затем запустить давно работает код, который вы должны увидеть:

Background 
Background 
Start 
Background 
Background 
Background 
Background 
Background 
Finish 
Background 
Background 

Он также может быть стоит посмотреть в Matlab Parallel Computing Toolbox.