2010-10-01 5 views
3

J'ai une application qui interroge un service Web selon une plage de dates. Le service Web renvoie une liste de GUID. Je prends alors chaque GUID et télécharge un fichier WAV qui correspond aussi. En ce moment je le fais un par un et fonctionne bien. Ce que je voudrais faire est de télécharger jusqu'à N nombre de fichiers WAV simultanément. Pour une raison quelconque, je ne peux pas saisir un bon moyen d'accomplir cela. J'utilise le composant TipwHTTP (async) IP * Works (n/Software) IP * Works (n/Software).Gestion de N téléchargements HTTP simultanés

Tout le monde a des suggestions pour me pousser dans la bonne direction.

Répondre

7

Mettez chaque téléchargement dans un fil séparé et gérez cette liste de téléchargements. Vous pouvez par exemple utiliser OmniThreadLibrary pour faciliter la programmation des threads. Vous pouvez également regarder mon unité de filetage au Cromis, ce qui est beaucoup plus simple mais cela peut suffire pour votre cas. C'est très facile à utiliser.

Si vous n'aimez pas les threads, vous pouvez également créer un exe qui prend les paramètres d'entrée au démarrage et télécharge le contenu vers un emplacement spécifié. Notez simplement que le téléchargement simultané de nombreux fichiers n'aidera probablement que si vous téléchargez à partir de différentes sources, sinon vous serez toujours limité par la bande passante de votre source unique et vous aurez également un overhead sur vous.

Voici un code avec mon unité de filetage et Indy pour HTTP, juste par exemple parce qu'il est facile à comprendre:

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

ce qui est excellent. Je vais vérifier OmniThreadLibrary. Merci pour l'aide! – kirkdmo

+0

J'ai fini par utiliser votre bibliothèque Cromis et ça marche fantastique !! Merci beaucoup pour la contribution et pour la bibliothèque facile! – kirkdmo

+0

@kdunlapmo, De rien, je suis heureux de pouvoir vous aider. – Runner

Questions connexes