在Matlab中使用定时器的回调函数

时间:2011-08-04 13:31:33

标签: matlab matlab-class

我正在研究MATLAB中内容分发服务器的统计模型,并决定使用OO编程。这是我第一次使用MATLAB进入OO,我遇到了麻烦。我正在尝试建模到服务器的下载连接,目前它只是一个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 个答案:

答案 0 :(得分:2)

我解决了我遇到的问题,问题在于声明回调处理程序的方式。我不确定是否确切原因,但如果有人有兴趣,可以在此处找到更好的解释,请参阅此博文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 :(得分:1)

我的猜测没有尝试,是回调需要是一个静态类函数,参数列表需要与定时器的适当参数。然后,静态类回调将需要定位对象引用以设置实例isActive标志。 findobj可能会按名称获取类对象实例,因为您选择使用句柄对象但可能会影响实时响应。

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


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

只是一个猜测。祝你好运,因为我最近一直在考虑尝试这个问题,所以对真正的答案感兴趣。

答案 2 :(得分:0)

---- 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)