加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 维护N个同时HTTP下载

发布时间:2020-12-15 09:06:22 所属栏目:大数据 来源:网络整理
导读:我有一个按日期范围查询Web服务的应用程序. Web服务返回GUID列表.然后我获取每个GUID并下载它对应的WAV文件.现在我一个接一个地做,工作正常.我想要做的是同时下载N个WAV文件.出于某种原因,我无法掌握实现这一目标的好方法. 我使用IP * Works(n / Software)Ti
我有一个按日期范围查询Web服务的应用程序. Web服务返回GUID列表.然后我获取每个GUID并下载它对应的WAV文件.现在我一个接一个地做,工作正常.我想要做的是同时下载N个WAV文件.出于某种原因,我无法掌握实现这一目标的好方法.

我使用IP * Works(n / Software)TipwHTTP(异步)组件.

任何人都有任何建议让我朝着正确的方向前进.

解决方法

将每个下载放在一个单独的线程中并管理下载列表.例如,您可以使用 OmniThreadLibrary来简化线程编程.您还可以在 Cromis查看我的穿线单元,这样做更简单,但它可能足以满足您的需求.这是非常容易使用.

如果您不喜欢线程,您还可以创建一个在启动时获取输入参数的exe并将内容下载到指定位置.

请注意,如果您从不同的来源下载,同时下载许多文件只会有所帮助,如果不是,您仍然会受到您唯一来源的带宽的限制,并且还会产生线程开销.

这是我的线程单元和Indy for HTTP的代码,例如,因为它很容易理解:

procedure TfMain.FormCreate(Sender: TObject);
var
  Task: ITask;
begin
  FTaskPool.DynamicSize := cbDynamicPoolSize.Checked;
  FTaskPool.MinPoolSize := StrToInt(ePoolSize.Text);
  FTaskPool.OnTaskMessage := OnTaskMessage;
  FTaskPool.Initialize;

  for I := 1 to NumberOfDownloads do
  begin
    Task := FTaskPool.AcquireTask(OnTaskExecute,'HTTPDownload');
    Task.Values.Ensure('TargeFile').AsString := aFileName;
    Task.Values.Ensure('URL').AsString := aDownloadURL;
    Task.Run;
  end;
end;

procedure TfMain.OnTaskExecute(const Task: ITask);
var
  HTTPClient: TIdHTTP;
  FileStream: TFileStream;
begin
  HTTPClient := TIdHTTP.Create(nil);
  try
    FileStream := TFileStream.Create(Task.Values.Get('TargeFile').AsString,fmCreate);
    try
      HTTPClient.Get(Task.Values.Get('URL').AsInteger,FileStream);
      Task.Message.Ensure('Result').AsString := 'Success';
      Task.SendMessageAsync;
    finally
      FileStream.Free;
    end;   
  finally
    HTTPClient.Free;
  end;
end;

procedure TfMain.OnTaskMessage(const Msg: ITaskValues);
begin
  // do something when a single download has finished
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读