これは、this questionと多少関連していますが、あまり関係ありません。MATLAB - タイマが関与しているときにオブジェクトがクリアされない
私は二つのクラス、FunctionWrapper
とTimerWrapper
あります
classdef FunctionWrapper < handle
methods
function Fcn(obj)
disp('FunctionWrapper.Fcn was called!');
end
end
end
classdef TimerWrapper < handle
properties
Timer
end
methods
function obj = TimerWrapper(other_object)
obj.Timer = timer;
set(obj.Timer, 'Period', 1);
set(obj.Timer, 'ExecutionMode', 'fixedSpacing');
set(obj.Timer, 'TimerFcn', @(event, data) other_object.Fcn);
end
function start(obj)
start(obj.Timer);
end
function stop(obj)
stop(obj.Timer);
end
function delete(obj)
disp('destructor called!');
delete(obj.Timer);
end
end
end
は、私がコマンドウィンドウに次のコードを実行言う:
>> F = FunctionWrapper;
>> T = TimerWrapper(F);
>> clear T %# T's destructor not called
>> timerfind %# just to verify that no, the destructor was never called
Timer Object: timer-1
Timer Settings
ExecutionMode: fixedSpacing
Period: 1
BusyMode: drop
Running: off
Callbacks
TimerFcn: @(event,data)other_object.Fcn
ErrorFcn: ''
StartFcn: ''
StopFcn: ''
ここで何が起こっていますか?私はtimer
オブジェクトを手動で削除する必要があることを知っていますが、私はTimerWrapper
のデストラクタで扱われると思いました。 Amro's ugly but straightforward workaround to overload the clear
commandを使用しないと、作業場からclear T
への道はありますか?さらに、T
を参照するものは何もないので、なぜそのリファレンスが存在しますか? (デストラクタが呼び出されないという事実は、この事実を意味しています。)これはタイマオブジェクト自体に埋め込まれていますか?
私は実際に 'F'への参照を完全に削除し、これをテストするためにコールバックに' disp'を使用しました。それでも、それ自体は適切にクリアされません。 –
しかし、T.deleteと入力し、その後にクリアTを入力すると、正しく動作しますか? –
はい、そうです。これは正しい方法ですが、私のコードベースは巨大で、私のユーザ(実際にはほとんどのMATLABユーザ)は、 'delete'と' clear'が2つの異なることを全く知らないのです。とにかく、私は 'TimerFcn'を持っているとなぜこの動作が起こるのか理解しようとしています(これはバグではないと思います)。 –