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 个评论
Walter Roberson
2019-8-13
At the time that a particular event is received, how can the code know that it is the last in the series or not?
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
2019-8-13
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
0 个评论
更多回答(1 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Startup and Shutdown 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!