gpt4 book ai didi

delphi - 维护 N 个同步 HTTP 下载

转载 作者:可可西里 更新时间:2023-11-01 16:05:54 24 4
gpt4 key购买 nike

我有一个按日期范围查询 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com