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