我有一个按日期范围查询Web服务的应用程序。 Web服务返回GUID列表。然后我获取每个GUID并下载它对应的WAV文件。现在我一个接一个地做,工作正常。我想要做的是同时下载N个WAV文件。出于某种原因,我无法掌握实现这一目标的好方法。
我使用IP * Works(n / Software)TipwHTTP(异步)组件。
任何人都有任何建议让我朝着正确的方向前进。
答案 0 :(得分:7)
将每个下载放在一个单独的线程中并管理下载列表。例如,您可以使用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;