Отображение текущего состояния для сообщения HTTP

Этот пример показывает, как реализовать монитор прогресса, MyProgressMonitor, который отображает индикатор выполнения для данных, переданных и от веб-сайта. Контрольные дисплеи индикатор выполнения в окне создаются функцией MATLAB® waitbar. Это использует set.Direction и методы set.Value, чтобы наблюдать изменения к свойствам Direction и Value.

Каждый раз, когда MATLAB устанавливает свойство Direction, MyProgressMonitor создает окно индикатора выполнения и отображает или отправку или сообщение получения.

Создайте следующий файл класса MyProgressMonitor.

Класс инициализирует свойство Interval к секундам .001, потому что пример отправляет только 1 Мбайт данных. Маленький интервал позволяет вам наблюдать индикатор выполнения.

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);

Смотрите также

|

Была ли эта тема полезной?