フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: TNetHTTPClientの非同期操作
3ma
メンバー
投稿数: 11
TNetHTTPClientの非同期操作
on: 2018/11/17 09:40 Sat

お世話になります。3maです。

早速、お知恵をお借りしたいのですが。
現在、TNetHTTPClientを使用して、ネットワークカメラのストリーミング受信にて
映像を表示しています。

OnReceiveDataにてAbortにTrueを指定して、受信を終了しています。

そこまでは、どうにかうまく動いています。

しかし、受信中にアプリを終了させるなどすると、
受信スレッドが終了する前(OnReceiveDataが呼ばれる前)に破棄されるため、
エラーとメモリリークが発生してしまいます。

なんとか、外からTNetHTTPClientのスレッドを強制的に終了させる方法は無いでしょうか?

現在の対処案
1.終了の時だから、エラーとリークは無視する…(!)
2.このコンポーネト使用者に、終了する前に必ずActive := False;を実行させる事を強制する…(!)
3.TNetHTTPClientみたいなクラスを書き起こす…(!!)

よろしくお願いいたします。

以下、クラスの抜粋です。

TNetcameraView = class(TControl)
private
FHTTPView: TNetHTTPClient;
FActive: Boolean;
FAbortRequest: Boolean;
FAborted: Boolean;
protected
procedure ViewReceiveData(const Sender: TObject; ... var Abort: Boolean);
published
property Active: Boolean read FActive write SetActive;
end;

constructor TNetCameraView.Create(Sender: TObject);
begin
inherited;

FHTTPView := TNetHTTPClient.Create( nil );
FHTTPView.OnReceiveData := ViewReceiveData;
FHTTPView.Asynchronous := True;
end;

destructor TNetcameraView.Destroy(Sender: TObject);
begin
Active := False; // ここでスレッドを終了させようとするが間に合わない。

// while( not( Aborted ) )do // OnReceiveDataはSynchronizeで呼び出されるのでこんな事をしても無駄
// Sleep( 1 );

// FHTTPView.ASyncAbort; // こんな手続きがあれば理想だけど、

FHTTPView.DisposeOf;
end;

procedure TNetCameraView.ViewRecieveData(Sender: TObject; ... var Abort: Boolean);
begin
if( FAbortRequest )then
begin
Abort := True;
FAborted := True;
Exit;
end;

// 以下受信処理
end;

procedure TNetCameraView.SetActive(const Value: Boolean);
begin
FActive := Value;
if( Active )then
begin
FAbortRequest := False;
FAborted := False;
FHTTPView.Get( URL, FStream );
end else
FAbortRequest := True;
end;
3ma
メンバー
投稿数: 11
Re: TNetHTTPClientの非同期操作
on: 2018/11/17 21:32 Sat

Application.ProcessMessagesで、待機する案も有りますけど、
その為だけに、

uses
FMX.Forms

 
が、美しく無いですよね……

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.024 sec.