Как решить ошибку рекурсии Matlab RecursionDetected в hgload? - PullRequest
1 голос
/ 22 марта 2011

Мой графический интерфейс Matlab использует нажатие кнопки для запуска другого графического интерфейса.

Недавно я обнаружил, что при интенсивном нажатии на эту кнопку я вызываю сбой matlab с ошибкой рекурсии (см. Описание ниже). Что вызвало эту ошибку рекурсии и как я могу ее исправить в следующий раз?

Описание ошибки:

??? Ошибка при использовании ==> hgload> localCheckRecursion на 155 При загрузке c: \ Algo \ MyGUI.fig происходит рекурсия.

Ошибка в ==> hgload на 56 Guard = localCheckRecursion (полный путь); % # Ок

Ошибка в ==> openfig на 72 [fig, savevisible] = hgload (имя файла, структура ('Visible', 'off'));

Ошибка в ==> gui_mainfcn> local_openfig на 286 gui_hFigure = openfig (name, singleton, visible);

Ошибка в ==> gui_mainfcn на 159 gui_hFigure = local_openfig (gui_State.gui_Name, gui_SingletonOpt, gui_Visible);

Ошибка в ==> PumpControl на 42 gui_mainfcn (gui_State, varargin {:});

Ответы [ 2 ]

1 голос
/ 22 марта 2011

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

Вы можете создать элементы управления графическим интерфейсом в MATLAB таким образом, чтобы они игнорировали быстрое нажатие, как это, установив 'BusyAction' и 'Interruptible' свойств следующим образом (где hButton - это дескриптор для вашего объекта кнопки):

set(hButton,'BusyAction','cancel','Interruptible','off');

Установка 'Interruptible' в 'off' означает, что обратный вызов кнопки не можетбыть прерванным во время его работы (за исключением определенных «специальных» обратных вызовов), а установка 'BusyAction' на 'cancel' означает, что нажатие кнопки будет игнорироваться, если другой обратный вызов (или его собственный) уже выполняется.

0 голосов
/ 22 марта 2011

Это обычно означает, что ваш обратный вызов делает что-то, что позволяет поступать большему количеству событий, запускает еще одну копию вашего обратного вызова и т. Д. *

Обычное исправление - не делать то, что позволяет событиям обрабатываться. Классический вариант - использовать drawnow («expose») вместо drawnow, потому что drawnow («expose») позволяет обрабатывать события рисования, не пропуская больше нажатий кнопок.

Похоже, проблема в вашем случае в том, что hgload пропускает события. Есть несколько команд (например, рисунок), которые делают это, и может быть трудно найти обходной путь для них. Вы можете увеличить свой предел рекурсии, но это только отложит проблему.

Извините, у меня нет решения для вас.

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