我正在研究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
答案 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)