使用实时流终止 TNetHTTPClient get 请求的正确方法

问题描述 投票:0回答:0

我有一个线程使用 TNetHTTPClient 组件从实时摄像头流中获取数据。请注意,相机仅在检测到运动时才拍摄图像,因此流不是连续的。 HTTPClient 调用 get 传递内存流 (MSImage)。 OnReceiveData 的事件处理程序处理流式数据并从中提取图像。那部分工作正常。

我不确定如何在应用程序关闭时终止 get。我尝试过使用异步和同步模式。我下面的代码显示了异步选项,我在其中使用重复直到循环来保持 Execute 方法运行直到线程终止。

OnReceiveData 事件处理程序有一个名为 AAbort 的参数。如果我将其设置为 true,应用程序将正确关闭。然而,由于流式数据不是恒定的,因此无法保证在应用程序关闭时会调用此事件。

我在下面显示的代码确实有效,但在应用程序关闭时会导致内存泄漏。泄漏似乎是内存流关闭时内存流中的任何数据。

中断 get 调用的正确方法是什么?

procedure TReadThread.Execute;
var
  HTTPClient: TNetHTTPClient;
begin
  inherited;
  HTTPClient := TNetHTTPClient.Create(nil);
  HTTPClient.Asynchronous := True;
  HTTPClient.OnReceiveData := HTTPClientReceiveData;

  try
    HTTPClient.PreemptiveAuthentication := True;
    HTTPClient.CredentialsStorage.AddCredential(TCredentialsStorage.TCredential.Create(TAuthTargetType.Server, '', FEndpoint, 'username', 'password'));
    HTTPClient.Get(FEndpoint, MSImage);

    repeat
      FTerminateEvent.WaitFor(100);
    until Terminated;

  finally
    MSImage.Clear;
    HTTPClient.Free;
  end;
end;
delphi httpclient
© www.soinside.com 2019 - 2024. All rights reserved.