Main Content

HTTP メッセージの進行状況モニターの表示

この例では、Web サイトとの間で送受信されるデータ用の進行状況バーを表示する、進行状況モニター MyProgressMonitor の実装方法を説明します。このモニターでは、MATLAB® 関数 waitbar により作成されるウィンドウに進行状況バーが表示されます。このモニターは set.Direction メソッドおよび set.Value メソッドを使用して、Direction プロパティと Value プロパティの変更を監視します。

MATLAB により Direction プロパティが設定されるたびに、MyProgressMonitor により進行状況バー ウィンドウが作成され、送信メッセージまたは受信メッセージが表示されます。

次の MyProgressMonitor クラス ファイルを作成します。

この例で送信されるデータは 1 MB しかないため、クラスでは Interval プロパティが .001 秒に初期化されます。短い間隔にすることで、進行状況バーが観察できるようになります。

classdef MyProgressMonitor < matlab.net.http.ProgressMonitor
    properties
        ProgHandle
        Direction matlab.net.http.MessageType
        Value uint64
        NewDir matlab.net.http.MessageType = matlab.net.http.MessageType.Request
    end
    
    methods
        function obj = MyProgressMonitor
            obj.Interval = .001;
        end
        
        function done(obj)
            obj.closeit();
        end
        
        function delete(obj)
            obj.closeit();
        end
        
        function set.Direction(obj, dir)
            obj.Direction = dir;
            obj.changeDir();
        end
        
        function set.Value(obj, value)
            obj.Value = value;
            obj.update();
        end
    end
    
    methods (Access = private)
        function update(obj,~)
            % called when Value is set
            import matlab.net.http.*
            if ~isempty(obj.Value)
                if isempty(obj.Max)
                    % no maximum means we don't know length, so message 
                    % changes on every call
                    value = 0;
                    if obj.Direction == MessageType.Request
                        msg = sprintf('Sent %d bytes...', obj.Value);
                    else
                        msg = sprintf('Received %d bytes...', obj.Value);
                    end
                else
                    % maximum known, update proportional value
                    value = double(obj.Value)/double(obj.Max);
                    if obj.NewDir == MessageType.Request
                        % message changes only on change of direction
                        if obj.Direction == MessageType.Request
                            msg = 'Sending...';
                        else
                            msg = 'Receiving...';
                        end
                    end
                end
                if isempty(obj.ProgHandle)
                    % if we don't have a progress bar, display it for first time
                    obj.ProgHandle = ...
                        waitbar(value, msg, 'CreateCancelBtn', ...
                            @(~,~)cancelAndClose(obj));
                    obj.NewDir = MessageType.Response;
                elseif obj.NewDir == MessageType.Request || isempty(obj.Max)
                    % on change of direction or if no maximum known, change message
                    waitbar(value, obj.ProgHandle, msg);
                    obj.NewDir = MessageType.Response;
                else
                    % no direction change else just update proportional value
                    waitbar(value, obj.ProgHandle);
                end
            end
            
            function cancelAndClose(obj)
                % Call the required CancelFcn and then close our progress bar. 
                % This is called when user clicks cancel or closes the window.
                obj.CancelFcn();
                obj.closeit();
            end
        end
        
        function changeDir(obj,~)
            % Called when Direction is set or changed.  Leave the progress 
            % bar displayed.
            obj.NewDir = matlab.net.http.MessageType.Request;
        end
    end
    
    methods (Access=private)
        function closeit(obj)
            % Close the progress bar by deleting the handle so 
            % CloseRequestFcn isn't called, because waitbar calls 
            % cancelAndClose(), which would cause recursion.
            if ~isempty(obj.ProgHandle)
                delete(obj.ProgHandle);
                obj.ProgHandle = [];
            end
        end
    end
end

操作を開始するには、進行状況モニターを指定します。

opt = matlab.net.http.HTTPOptions(...
    'ProgressMonitorFcn',@MyProgressMonitor,...
    'UseProgressMonitor',true);

データを作成します。

x = ones(1000000,1,'uint8');
body = matlab.net.http.MessageBody(x);

メッセージを作成します。httpbin.org/put サービスは、PUT メッセージで受信したデータを返します。

url = matlab.net.URI('http://httpbin.org/put');
method = matlab.net.http.RequestMethod.PUT;
req = matlab.net.http.RequestMessage(method,[],body);

メッセージを送信します。

[resp,~,hist] = req.send(url,opt);

参考

|