image thumbnail
from System Resource Monitor for Windows by Xin Zhao
A GUI used to monitor and record the system resources(memory, CPU usage)

PerfMonitor
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


Contact us