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

2 次查看(过去 30 天)
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?
  2 个评论
Matt J
Matt J 2019-8-13
royk's comment moved here:
I guess that's my question!
I can imagine the last event can be identified by either:
(1) no additional events within a set time frame;
(2) Matlab becomes "not-busy" within a set time frame.
But in any of these options, my problem is that I cannot simply put a "pause" command in the callback function since this will prevent also the continued execution of the calling objects and thereby will delay the upcoming event notifications.

请先登录,再进行评论。

采纳的回答

Guillaume
Guillaume 2019-8-13
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

更多回答(1 个)

royk
royk 2019-8-13
looks great - much thanks!!

类别

Help CenterFile Exchange 中查找有关 Programming 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by