【问题标题】:Benefit of using event listeners over functions callbacks in Matlab在 Matlab 中使用事件侦听器而不是函数回调的好处
【发布时间】:2020-07-09 10:08:08
【问题描述】:

注意:这里的问题专门针对Matlab的情况!

这个问题的上下文是一个 Matlab 句柄类,它通过 websocket 接收一些数据,对该数据进行一些处理,然后将数据转发给其他一些类,这些类使用回调注册自己。

这个类的简化版本如下:

classdef ReceiverWebsocket < WebSocketClient

  properties (Access = private)
    dataReceivers_ % Stores the callback functions and their desired rate
  end

  methods

    function obj = ROSReceiverWebsocket(TOPIC, URI, varargin)
      obj = obj@WebSocketClient(URI, varargin{:});

      obj.dataReceivers_ = containers.Map;
    end

    function registerReceiver(obj, name, rate, callback)
      cb.name = name;
      cb.callback = callback;
      
      obj.dataReceivers_(name) = cb;
    end
    
    % Implement the abstract callback functions
    function onTextMessage(obj,message)
      data = jsondecode(message);

      for key = keys(obj.dataReceivers_)

        cb = obj.dataReceivers_(cell2mat(key));
        cb.callback(data);

      end
    end
    
  end
end

在研究如何在 Matlab 中实现这样的功能时,我还遇到了event listeners and notifyers in Matlab 的概念。

据我了解,可以使用句柄类事件重新实现上述功能,然后在onTextMessage(...) 函数中调用notify(...),而不是直接调用回调函数。


我现在的问题是,如果有的话:

  • 与直接回调相比,使用事件侦听器功能有什么好处?
  • 使用直接回调有什么缺点吗?

我尤其无法找到有关通知事件回调如何执行的任何信息,包括执行顺序、任何执行延迟甚至在不同线程中的执行。

【问题讨论】:

    标签: matlab events callback


    【解决方案1】:

    一如既往,这取决于您的用例。

    就个人而言,我认为使用事件的主要优点是您可以有多个由单个事件触发的侦听器(无需额外编码,请参见此处的示例:https://mathworks.com/matlabcentral/answers/13305-can-timers-trigger-a-single-event-that-many-objects-listen-to)。

    它还允许您使用可能不同的参数列表进行回调,而在您的示例中,回调函数必须只接受一个参数,即数据。

    关于执行顺序(https://de.mathworks.com/help/matlab/matlab_oop/callback-execution.html#bu0b2f4):

    未定义事件触发后侦听器回调函数的执行顺序。但是,所有侦听器回调都会与事件触发同步执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2021-01-07
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多