Функции обратного вызова с использованием таймеров в Matlab - PullRequest
2 голосов
/ 04 августа 2011

Я работаю над статистической моделью сервера распространения контента в MATLAB и решил использовать ОО-программирование.Это мой первый набег в ОО с MATLAB, и я столкнулся с проблемой.Я пытаюсь смоделировать соединение для загрузки с сервером, на данный момент это просто таймер MATLAB и логическое значение.Когда таймер истекает, я хочу установить поле isActive от true до false.Я чувствую себя так просто, но я боролся с этим уже не один день.Ниже приведен код для класса:

    classdef dl<handle
        properties
            isActive = true
            ttl = 0
        end
        methods
            function this = startTimer(this, varargin)
                this.ttl = timer('TimerFcn', @()killConnection(this), 'StartDelay',1);     
                start(this.ttl);            
            end
        end

        methods (Access = private)
            function obj = killConnection(obj, varargin)
                obj.isActive = false;
            end        
        end
    end

Ответы [ 3 ]

2 голосов
/ 05 августа 2011

Я решил проблему, с которой столкнулся, проблема была в том, как был объявлен обработчик обратного вызова.Я не уверен, если точная причина, но есть лучшее объяснение здесь, если кому-то интересно, см. Этот пост в блоге http://syncor.blogspot.com/2011/01/matlabusing-callbacks-in-classdef.html.

Вот изменения, которые я сделал, чтобы получить успешную операцию.Сначала я изменил функцию обратного вызова на правильную структуру для обратного вызова:

    function killConnection(event, string_arg, this)

Затем я объявил обратный вызов по-разному в таймере:

    this.ttl = timer('TimerFcn', {@dl.killConnection, this}, 'StartDelay',1);

Это сработало для меня.Спасибо за помощь, которая мне действительно досталась: P.

1 голос
/ 05 августа 2011

Я думаю, не пытаясь это сделать, это то, что обратный вызов должен быть статической функцией класса, а список аргументов должен иметь правильные параметры для таймера.Затем обратному вызову статического класса потребуется найти ссылку на объект, чтобы установить флаг экземпляра isActive.findobj может получить экземпляр объекта класса по имени, так как вы решили использовать объект дескриптора, но это может повлиять на ответ в реальном времени.

this.ttl = timer('TimerFcn', @dl.killConnection, 'StartDelay',1); 


methods(Static)
      function killConnection(obj, event, string_arg)
        ...
      end
end

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

0 голосов
/ 12 ноября 2012

---- TimerHandle.m ---------

classdef TimerHandle < handle    
    properties
        replay_timer
        count = 0
    end
    methods
        function register_timer(obj)
            obj.replay_timer = timer('TimerFcn', {@obj.on_timer}, 'ExecutionMode', 'fixedSpacing', ...
                'Period', 1, 'BusyMode', 'drop', 'TasksToExecute', inf);
        end
        function on_timer(obj, varargin)
            obj.count = obj.count + 1;
            fprintf('[%d] on_timer()\n', obj.count);
        end
        function delete(obj)
            delete(obj.replay_timer);
            obj.delete@handle();
        end
    end
end

Использование:

>> th = TimerHandle;
>> th.register_timer
>> start(th.replay_timer)
[1] on_timer()
[2] on_timer()
[3] on_timer()
[4] on_timer()
[5] on_timer()
[6] on_timer()
[7] on_timer()
[8] on_timer()
[9] on_timer()
>> stop(th.replay_timer)
>> delete(th)
...