classdef PerfMonitor < handle
% managing the display control
properties (SetAccess = 'private', GetAccess = 'public')
hSysInfoData = [];
hTimer = [];
hDisplay = [];
end
properties (SetAccess = 'private', GetAccess = 'private')
% listener
destroyListener; % when display is closed/deleted, we delete PerfMonitor instance
startMeasureListener; % when start button is clicked
stopMeasureListener; % when stop button is clicked
end
methods
function pfmonObj = PerfMonitor(updateperiod)
if nargin < 1
updateperiod = 0.5;
end
pfmonObj.hSysInfoData = SysInfoData;
pfmonObj.hTimer = timer;
pfmonObj.hTimer.Period = updateperiod;
pfmonObj.hTimer.ExecutionMode = 'fixedRate';
pfmonObj.hTimer.TimerFcn = @(obj, evnt)pfmonObj.onMeausure();
pfmonObj.hTimer.TasksToExecute = Inf;
pfmonObj.hDisplay = DisplayManager();
% udpate display
% machine name
set(pfmonObj.hDisplay.hMachineNameEdit, 'String', pfmonObj.hSysInfoData.MachineName);
% TODO
set(pfmonObj.hDisplay.hOsNameEdit, 'String', 'Winxp');
cpuInfo = sprintf('%dx%s', pfmonObj.hSysInfoData.NumOfCPU, pfmonObj.hSysInfoData.CpuSpeed);
set(pfmonObj.hDisplay.hCpuInfoEdit, 'String', cpuInfo);
memInfo = sprintf('%d%s', pfmonObj.hSysInfoData.TotalMemory, pfmonObj.hSysInfoData.UsedMemoryUnits);
set(pfmonObj.hDisplay.hMaxMemEdit, 'String', memInfo);
verInfo = ver('MATLAB');
verStr = strrep(verInfo.Release, '(', '');
verStr = strrep(verStr, ')', '');
set(pfmonObj.hDisplay.hReleaseVerEdit, 'String', verStr);
% fix Y-axis for memory
[~, sysMem] = memory;
maxPossibleMemory = sysMem.PhysicalMemory.Available;
maxPossibleMemoryMB = maxPossibleMemory/1024^2;
set(pfmonObj.hDisplay.hMemDispAxes, 'YLim', [0, maxPossibleMemoryMB]);
% linsteners for self-destroy
pfmonObj.destroyListener = addlistener(pfmonObj.hDisplay, 'onDelete', @(src, evnt)delete(pfmonObj));
% when start button is clicked
pfmonObj.startMeasureListener = addlistener(pfmonObj.hDisplay, 'onStartEngine', @(src, evnt)start(pfmonObj));
% when stop button is clicked
pfmonObj.stopMeasureListener = addlistener(pfmonObj.hDisplay, 'onStopEngine', @(src, evnt)stop(pfmonObj));
end
function delete(pfmonObj)
stop(pfmonObj);
% remove listener
delete(pfmonObj.destroyListener);
if isvalid(pfmonObj.hTimer)
delete(pfmonObj.hTimer);
end
if isvalid(pfmonObj.hSysInfoData)
delete(pfmonObj.hSysInfoData);
end
if isvalid(pfmonObj.hDisplay)
delete(pfmonObj.hDisplay);
end
end % delete
function start(pfmonObj)
start(pfmonObj.hTimer);
end
function stop(pfmonObj)
stop(pfmonObj.hTimer);
end
function onMeausure(pfmonObj)
% measure data
pfmonObj.hSysInfoData.measure;
% update the display
pfmonObj.hDisplay.updateDisplay(pfmonObj.hSysInfoData);
end
end
end