3
我有一個應用程序按日期範圍查詢Web服務。 Web服務返回一個GUID列表。然後我採取每個GUID並下載它對應的WAV文件。現在我一個一個做,並且工作正常。我想要做的是同時下載N個WAV文件。出於某種原因,我無法掌握完成這一任務的好方法。我使用IP * Works(n/Software)TipwHTTP(異步)組件。維護N個HTTP同時下載
任何人都有任何建議將我推向正確的方向。
我有一個應用程序按日期範圍查詢Web服務。 Web服務返回一個GUID列表。然後我採取每個GUID並下載它對應的WAV文件。現在我一個一個做,並且工作正常。我想要做的是同時下載N個WAV文件。出於某種原因,我無法掌握完成這一任務的好方法。我使用IP * Works(n/Software)TipwHTTP(異步)組件。維護N個HTTP同時下載
任何人都有任何建議將我推向正確的方向。
將每個下載放在一個單獨的線程中,並管理該下載列表。例如,您可以使用OmniThreadLibrary來簡化線程編程。你也可以看看我的穿線裝置Cromis,這簡單得多,但對你的情況來說可能就足夠了。這是非常容易使用。
如果你不喜歡線程,你也可以創建一個exe文件,它在啓動時接受輸入參數並將內容下載到指定位置。
請注意,同時下載多個文件只會在您從不同來源下載時有所幫助,如果不是這樣,您仍然會受到唯一來源的帶寬限制,並且還會對您造成線程負擔。
這裏是我的線索化單元和印地用於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;
這是偉大的。我將檢查OmniThreadLibrary。謝謝您的幫助! – kirkdmo 2010-10-01 13:16:15
我結束了使用你的克羅米斯圖書館,它的工作太棒了!非常感謝你的輸入和簡單的圖書館! – kirkdmo 2010-10-01 15:58:38
@kdunlapmo,不客氣,我很高興能幫上忙。 – Runner 2010-10-01 16:19:44