MATLAB вложенные уведомления о событиях? - PullRequest
2 голосов
/ 14 сентября 2011

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

classdef testClass < handle
    events
        testevent
    end

    methods
        function obj = testClass
            obj.addlistener('testevent', @obj.respond);
        end
        function raise(obj)
            obj.notify('testevent');
        end
        function respond(obj, varargin)
            fprintf('Responded!\n');
            obj.raise();
        end
    end

end

когда я выполняю код

c = testClass;
c.raise();

Результат

Responded!

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

1 Ответ

4 голосов
/ 14 сентября 2011

Вы можете сделать слушатель рекурсивным, установив свойство Recursive дескриптора слушателя в true. Свойства дескриптора слушателя находятся на странице справки event.listener .Вам просто нужно указать выходной аргумент для obj.addlistener для получения дескриптора.

Вот код, который я использовал, чтобы заставить его работать:

classdef testClass < handle
    events
        testevent
    end

    methods
        function obj = testClass
            lh = obj.addlistener('testevent', @obj.respond);
            lh.Recursive = true;
        end
        function raise(obj)
            notify(obj,'testevent');
        end
        function respond(obj, varargin)
            fprintf('Responded!\n');
            obj.raise();
        end
    end
end

Также обратите внимание, что по умолчанию существует рекурсияограничение в 500 звонков, поэтому наивно код не будет бесконечно повторяться;используйте set(0, 'RecursionLimit', N), чтобы изменить это.Я думаю, что установка N=inf - плохая идея.

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