我将非常感谢您的帮助,建议或建议。我有一个使用同步接口控制大地测量仪器的应用程序。然而,一些命令本质上是异步的,例如, GetReflectors
。触发此命令后,我会收到尽可能多的服务器答案以及可用反射器的数量。所以我注册了一个COM事件和关联处理函数。到现在为止还挺好。我可以显示数据,但我不知道如何将一些变量传递给main函数。我试图将变量保存为.mat文件或.txt文件并读取它。实际上它在Matlab中工作但它在编译的.exe aplication(错误触发事件)中不起作用。甚至disp
命令在编译的应用程序中不起作用(不显示任何内容)。所以主要的问题是:如何将变量从处理程序传递给main函数。有办法吗?全局变量?谢谢菲利普
编辑:我正在添加一个代码来说明问题...我需要保存Reflector Name和Reflector ID,以便用户可以选择一个(因为有多个事件带有不同的Reflectors)。
function pushbutton_GetReflectors_Callback(hObject, eventdata, handles)
ltsync = actxserver ('LTControl.LTCommandSync2'); %Act as server: LTConnect2
ltsync.events() %List of all COM events
ltsync.registerevent({'ReflectorsData' 'ReflectorsHandler'}) %Register event
ltsync.GetReflectors() %Ask instrument for reflectors
pause(3) %Time to receive answers
end
function ReflectorsHandler(varargin) %Handler of the event ReflectorsData
%var1,var2,reflectorID,reflectorName,var5,surfaceOffset,reflectorsTotal,var8,var9
disp('Reflector Data:');
disp(varargin{3}) %Reflector ID
disp(varargin{4}) %Reflector name
end
答案 0 :(得分:0)
我相信你可以通过将函数句柄传递给registerevent
而不仅仅是字符串函数名来解决这个问题,并创建一个允许你传回数据的类。首先,课程:
classdef ReflectorsResponse < handle
properties (SetAccess = private)
reflectors
responseComplete = false;
reflectorsTotal = NaN;
end
methods
function respond(obj, varargin)
% Create a struct for each reflector (or you could define
% another class, but let's keep it simple for the time being)
newRefl = struct();
newRefl.ID = varargin{3};
newRefl.name = varargin{4};
newRefl.surfaceOffset = varargin{6};
% ... store other properties in struct
% Store this reflector
obj.reflectors = [obj.reflectors; newRefl];
% Store total reflector count and check for completion
if isnan(obj.reflectorsTotal)
obj.reflectorsTotal = varargin{7};
end
if length(obj.reflectors) == obj.reflectorsTotal
obj.responseComplete = true;
end
end
end
end
然后,您可以通过将respond
方法设为您的处理程序来使用它:
function pushbutton_GetReflectors_Callback(hObject, eventdata, handles)
% Create the response object and associated handler function handle
response = ReflectorsResponse();
handlerFun = @(varargin)response.respond(varargin{:});
ltsync = actxserver ('LTControl.LTCommandSync2'); %Act as server: LTConnect2
ltsync.events() %List of all COM events
ltsync.registerevent({'ReflectorsData' handlerFun}) %Register event
ltsync.GetReflectors() %Ask instrument for reflectors
% Wait for request to complete
while ~response.responseComplete
pause(0.1);
drawnow update;
% NOTE: Should add a timeout to this loop
end
% Do stuff with response.reflectors
end
这将等到每个反射器都有响应,其数量由第一个响应确定。请注意,您应该在while
循环中添加超时,否则您将面临无限等待的风险。
如果有很多这些异步请求需要处理,我建议封装整个请求/响应序列(包括创建ActiveX服务器,设置事件处理程序,等待响应) )在通用基类中,为每个不同的请求派生特定的子类。