JeremyLecouvert
Messages postés139Date d'inscriptionmardi 27 novembre 2007StatutMembreDernière intervention10 mai 2010
-
8 août 2008 à 17:51
JeremyLecouvert
Messages postés139Date d'inscriptionmardi 27 novembre 2007StatutMembreDernière intervention10 mai 2010
-
11 août 2008 à 11:46
Salut!
Je suis actuelle ment sur une appli qui permet de downloader des fichiers. J'utilise un TIdHTTP, ça donne à peu près ça (j'élague la construction de la String!):
function TForm1.GetFichier(const URL, FileName : string): Boolean;
var
idHttp: TIdHTTP;
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmCreate or fmShareExclusive);
try
idHttp := TIdHTTP.Create(nil);
try
idHttp.Get(URL, Stream);
finally
idHttp.Free;
end;
Result := True;
finally
Stream.Free;
end;
end;
...jusque là rien d'extraordinaire! Le souci c'est que je voudrais lancer plusieurs téléchargements simultanés.
J'appelle ma fonction dans une boucle. Je pensais jouer sur les évènements IdHTTPWorkBegin, ou qq chose dans le genre, mais ça changera rien puisque je ne sors de ma fonction qu'une fois le download terminé.
Quelqu'un aurait-il une solution (si possible en évitant le multithread)?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 8 août 2008 à 20:54
Salut !
"évitant le multithread"
=> impossible, du moins avec Indy, ces composants étant "bloquants".
Il te faudra donc créer un thread par fichier à télécharger.
Attention à la mise à jour de l'affichage, tout doit être fait dans les règles de l'art, sinon, malgré le fait que ça compilera, tu le ressentira au niveau des performances et ça risque même de planter.
Voila.
A+
Flo
PS: je vois que tu as bien pensé à utiliser les blocs try...finally mais pour le moment ton Result ne sert à rien puisque True est renvoyé même si idHttp.Get(...) plante.
JeremyLecouvert
Messages postés139Date d'inscriptionmardi 27 novembre 2007StatutMembreDernière intervention10 mai 20102 11 août 2008 à 11:46
'lut!
"...mais pour le moment ton Result ne sert à rien" => je sais, je l'ai mis là en vue d'une prochaine modif..
Donc Flo, si j'ai bien compris ("du moins avec Indy"), il y a un moyen de le faire avec d'autres composants? Tu penses peut-être au TWebBrowser? J'ai déjà essayé sur une autre appli (qui ne faisait pas de downloads), et j'ai eu des résultats assez bizarres dans le traitement en boucle de formulaires. Je remplissais mes champs une fois la page chargée; en debug pas de pb, mais en fonctionnement normal la page n'atteignait jamais l'état READYSTATE_COMPLETE... j'ai peut-être loupé qq chose sur le fonctionnement du composant!
En tout cas, si tu as des tuyaux en ce qui concerne mes pb de downloads, je suis preneur.
Re-merci.
@+
PS: "Attention à la mise à jour de l'affichage" => je suppose que tu parles des Application.ProcessMessages à mettre dans le prog pour ne pas figer l'affichage?