Как вы можете Interupt функции из обратного вызова GUI, не добавляя interupt-проверку к функции?(MATLAB) - PullRequest
1 голос
/ 22 сентября 2011

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

function result = process_data(data)
    result = 0;
    for big_loop=big_start:big_end
        for small_loop=small_start:small_end
            result = result+data; %in reality just some fancier matrix ops
        end
    end

Моя проблема заключается в том, как реализовать обратный вызов кнопки остановки, чтобы она возвращалась из process_data после текущей итерации малого цикла.

Сейчас я делаю это, изменяя код process_data следующим образом:

    function result = process_data_new(data)
        result = 0;
        for big_loop=big_start:big_end
            for small_loop=small_start:small_end
                result = result+data; %in reality just some fancier matrix ops
%new code start -----------------
                if interrupt_flag
                    return;
                end
%new code end -------------------- 
            end
        end

Однако я действительно хочу, чтобы прерывание обрабатывалось с конца графического интерфейса, чтобы мой код не был завален проверками прерываний (Мой реальный код включал бы подобные вещи очень часто, и пользователь мог иногда нужно изменить функцию process_data).

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

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

может быть это поможет:

имеет кнопку «стоп», в своем обратном вызове установите флаг в значение true.

в меньшем цикле (то есть другом обратном вызове, который занят циклом), он будет проверять этот флаг в верхней (или нижней) части своего (маленького) цикла.

Если флаг установлен в true, он сразу становится ложным и завершает весь цикл и возвращает. (добавьте проверку в свой цикл, чтобы проверить, установлен ли этот флаг)

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

обратные вызовы прерывают друг друга, поэтому вышеприведенное работает.

Флаг устанавливается в буфере userData и каждый раз читается оттуда другим обратным вызовом.

Этот фрагмент кода из одного моего примера

пример малого цикла

 function status= output(t,x,~,data)
         %called by ode45 after each step. Plot the current
         %pendulum position for simulation

         userData = get(data.handles.figure1, 'UserData');
         if userData.stop
             status=true;
             g_status =true;
         else
             status = false;
             .... do real work
         end
     end

обратный вызов кнопки «Выполнить»

% --- Executes on button press in run_btn.
function run_btn_Callback(hObject, eventdata, handles)
% hObject    handle to run_btn (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

[data,status] = parse_input(handles);
if not(status)
     return;
end
.....
userData.stop = false;
set(handles.figure1, 'UserData',userData);
...

обратный вызов кнопки остановки

% --- Executes on button press in reset_tag.
function reset_tag_Callback(hObject, eventdata, handles)
% hObject    handle to reset_tag (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


data = get(handles.figure1, 'UserData');
data.stop = true;
set(handles.figure1, 'UserData',data);
.....

0 голосов
/ 23 сентября 2011

что вам в основном нужно, это уничтожить process_data , как только пользователь нажмет кнопку «стоп»К сожалению, это невозможно, потому что в Matlab нет реальных потоков.Поэтому ваше единственное решение - это то, которое вы реализовали сами.

0 голосов
/ 22 сентября 2011

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

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

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