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