2010-10-01 29 views
3

我有一個應用程序按日期範圍查詢Web服務。 Web服務返回一個GUID列表。然後我採取每個GUID並下載它對應的WAV文件。現在我一個一個做,並且工作正常。我想要做的是同時下載N個WAV文件。出於某種原因,我無法掌握完成這一任務的好方法。我使用IP * Works(n/Software)TipwHTTP(異步)組件。維護N個HTTP同時下載

任何人都有任何建議將我推向正確的方向。

回答

7

將每個下載放在一個單獨的線程中,並管理該下載列表。例如,您可以使用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; 
+0

這是偉大的。我將檢查OmniThreadLibrary。謝謝您的幫助! – kirkdmo 2010-10-01 13:16:15

+0

我結束了使用你的克羅米斯圖書館,它的工作太棒了!非常感謝你的輸入和簡單的圖書館! – kirkdmo 2010-10-01 15:58:38

+0

@kdunlapmo,不客氣,我很高興能幫上忙。 – Runner 2010-10-01 16:19:44