【发布时间】:2023-03-30 18:00:02
【问题描述】:
我正在研究一个 MATLAB 类,该类存储一个使用tcpip 创建的接口对象,并包括一个供接口对象使用的回调函数,如下例所示:
classdef wsg50_mini2 < handle
properties
TCPIP
end
%PUBLIC METHODS
methods
%CONSTRUCTOR
function obj = wsg50_mini2(varargin)
fprintf('################# I am created #################\n')
obj.TCPIP = tcpip('localhost',1000);
obj.TCPIP.OutputBufferSize = 3000;
obj.TCPIP.InputBufferSize = 3000;
obj.TCPIP.ByteOrder = 'littleEndian';
obj.TCPIP.Timeout = 1;
%Setting up Callbackfunction
obj.TCPIP.BytesAvailableFcnMode = 'byte';
obj.TCPIP.BytesAvailableFcnCount = 1;
obj.TCPIP.BytesAvailableFcn = {@obj.TCP_Callback, obj};
end
end
%PRIVATE METHODS
methods (Access = private)
%DESTRUCTOR
function delete(obj)
fprintf('################# Hey I am called! #################\n')
instrreset
end
end
%STATIC METHODS
methods (Static)
%TCP Callback
%This function will be called if one Byte is available at the TCPIP
%buffer.
function TCP_Callback(tcpsocket,event,obj)
fprintf('Loading 1 Byte Data From Buffer.\n')
end
end
end
当我清除我的类时,变量将从工作区中清除,但不会调用 delete 析构函数。为什么不呢?
我意识到,我的仪器在仪器控制应用程序中仍然处于活动状态。如果我从那里删除我的 Instruments,我的 delete 析构函数会被调用。
我认为这是 tcpip 类的一些奇怪行为。
【问题讨论】:
-
你没有描述你的析构函数在什么意义上“停止工作”。但是调试帮助不太可能成为这里的主题问题,因此您可能不能只是改写为“为什么我的代码不能以这种方式工作?”。如果您可以将问题描述为“我如何编写以特定方式运行的
handle-class 析构函数?”那么这里可能有一个可挽救的问题。 -
那是我的错。如果我清除工作区,则不再调用析构函数。我将编辑问题。
-
请阅读minimal reproducible example。代码 sn-ps 对找出你的代码有什么问题几乎没有用处。
-
听起来基本上是我在 SO Find where handle is stored in scope 上的第一个问题的重复。这不是一个容易调试的问题。
-
我看到一个最小的示例是必要的。在构建我发现的最小可重现示例时,问题来自 tcpip 对象的回调函数。我编辑了我最初的问题并用示例替换了 sn-p。
标签: matlab destructor handle matlab-class