同时保持N个HTTP下载(Maintaining N simultaneous HTTP downloads)

编程入门 行业动态 更新时间:2024-10-24 14:16:25
同时保持N个HTTP下载(Maintaining N simultaneous HTTP downloads)

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

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

任何人都有任何建议来推动我朝着正确的方向前进。

I have an application that queries a web service by a date range. The web service returns a list of GUID's. I then take each GUID and download a WAV file that it corresponds too. Right now I do it one by one and works fine. What I would like to do is download up to N number of WAV files simultaneously. For some reason I just can not grasp a good way to accomplish this.

I use IP*Works (n/Software) TipwHTTP(async) component.

Anyone have any suggestions to push me in the right direction.

最满意答案

将每个下载放在一个单独的线程中并管理下载列表。 例如,您可以使用OmniThreadLibrary来简化线程编程。 你也可以看看我在克罗米斯的线程单元,这简单得多,但对你的情况来说可能就足够了。 这是非常容易使用。

如果你不喜欢线程,你也可以创建一个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;

Put each download in a separate thread and manage that list of downloads. You can use OmniThreadLibrary for instance to ease the thread programming. You can also look at my threading unit at Cromis which is a lot simpler but it may be enough for your case. It is very easy to use.

If you dislike threads you can also make an exe that takes input params when started and downloads the content to a specified location.

Just note that downloading many files simultaniously will only probably help if you download from different sources, if not you will still be limited by the bandwith of your only source and also have a threading overhead on you.

Here is a code with my threading unit and Indy for HTTP, just for example because it is easy to understand:

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;

更多推荐

本文发布于:2023-07-22 18:24:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1222310.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Maintaining   HTTP   downloads   simultaneous

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!