2013-11-18 3 views
1

Say У меня есть следующие функции:Как определить, когда вернуть выход из функции

function result=myfun(varargin)  
result=[];  
myFig=figure();  
B1=uicontrol(myFig,'Style','pushbutton','String','done','Callback',{@done_Callback});  

    function done_Callback(varargin) 
     result =10; 
     delete(mainFig); 
    end 
end 

Я пытаюсь вернуть только после того, как вывод кнопки обратного вызова выполняется. Прямо сейчас он сразу возвращает пустую переменную. Я знаю, как это сделать в GUI руководства, но весь мой проект написан без руководства. Я предполагаю, что мне где-то нужно uiwait, но не знаю, где.

ответ

2

Функция uicontrol только генерирует кнопку, она не ждет, пока она будет нажата. В противном случае полный GUI с несколькими элементами был бы невозможным - вы не могли бы вставить другой элемент до того, как первый не был активирован, а затем первый не мог быть активирован. По этой причине обратные вызовы GUI выполняются в другом потоке, чем основная программа Matlab, а именно в «очередь событий».

Если вы хотите, чтобы ваша программа ждать, пока кнопка не будет нажата, вы должны программировать это явно:

function result=myfun(varargin)  
result=[];  
myFig=figure();  
B1=uicontrol(myFig,'Style','pushbutton','String','done','Callback',{@done_Callback});  
while isempty(result) 
    drawnow 
end 

    function done_Callback(varargin) 
     result =10; 
     fprintf('hi\n') 
     delete(myFig); 
    end 
end 

В drawnow находится там, чтобы сказать Matlab он должен выделять время выполнения в очереди событий, которая обычно не выполняется, когда Matlab занят, например с запуском петли while.

Для (немного) дополнительной информации, посмотрите на How Does a GUI Work? и drawnow.

+0

спасибо. Это делает именно то, что я хотел. – user2908313

+0

Добро пожаловать. :) Я только что отредактировал ответ еще раз, возможно, вы найдете дополнительную информацию интересной. –

Смежные вопросы