我有一个按日期范围查询 Web 服务的应用程序。 Web 服务返回一个 GUID 列表。然后我获取每个 GUID 并下载它对应的 WAV 文件。现在我一一做并且工作正常。我想做的是同时下载最多 N 个 WAV 文件。出于某种原因,我无法掌握实现这一目标的好方法。

我使用 IP*Works (n/Software) TipwHTTP(async) 组件。

任何人都有任何建议将我推向正确的方向。

最佳答案

将每个下载放在一个单独的线程中并管理该下载列表。例如,您可以使用 OmniThreadLibrary 来简化线程编程。您还可以在 Cromis 上查看我的线程单元,这要简单得多,但对于您的情况可能已经足够了。这是非常容易使用。

如果您不喜欢线程,您还可以制作一个在启动时接受输入参数并将内容下载到指定位置的 exe。

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

这是我的线程单元和用于 HTTP 的 Indy 的代码,仅举个例子,因为它很容易理解:

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;

关于delphi - 维护 N 个同时进行的 HTTP 下载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3836465/

10-11 23:27
查看更多