MATLAB: How to make a class object respond to a long stream of event listener callbacks only at the end of the stream of events

eventslisteneroop

I have an object Obj of a handle class MyClass that listens for "Change" event notifications from other objects.
Obj runs an "update" function when these other objects notify a "Change" event.
Though, when multiple such “Change” events co-occur (namely, appearing in a fast sequence right after the other), then I would like the object to run the "update" function only after the last event (otherwise it is unnecessarily slow).
What would be the recommended way?

Best Answer

I guess this follows from your previous question.
As there's no matlab not busy kind of notification, I think the only way you could implement this is with a timer. Whenever you receive an update, start or restart a single shot timer and queue whatever needs queing. So it would be something like this:
classdef MasterController < handle
properties (Access = private)
updatetimer;
updatequeue = {};
end
%events, etc.
methods
%constructor
function this = MasterController()
%if MasterController is guaranteed to be a singleton, the timer could be constructed in the property declaration
%if not, it has to be constructed in the constructor to avoid all instances sharing the same timer
this.updatetimer = timer('BusyMode', 'queue', 'ExecutionMode', 'singleshot', 'StartDelay', 1, 'TimerFcn', @this.ExecuteQueue);
%StartDelay specifies how many seconds to wait before executing the queue. If an event occurs within that time, the timer will be reset
end
%the update callback
function CheckIn(this, updatedata)
%stop timer if running
if strcmp(this.updatetimer.Running, 'on')
stop(this.updatetimer);
end
this.updatequeue = {this.updatequeue, updatedata};
%and start timer
start(this.updatetimer);
end
end
methods (Access = private)
function ExecuteQueue(this, ~, ~)
%with matlab being single threaded, we shouldn't have to worry about having items added to the queue while we read the queue
%nonetheless, we can make a copy of the queue, clear it and work on the copy
queue = this.updatequeue;
this.updatequeue = {};
for queueditem = queue
%do something with queueditem{1}
end
end
end
end
Related Question