从事件处理程序传递变量

时间:2013-05-18 17:07:06

标签: matlab

我将非常感谢您的帮助,建议或建议。我有一个使用同步接口控制大地测量仪器的应用程序。然而,一些命令本质上是异步的,例如, 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

1 个答案:

答案 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服务器,设置事件处理程序,等待响应) )在通用基类中,为每个不同的请求派生特定的子类。