DOWNLOADS HTTP EN MULTITHREAD AVEC INDY

offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009 - 12 déc. 2008 à 09:27
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 15 déc. 2008 à 21:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48689-downloads-http-en-multithread-avec-indy

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
15 déc. 2008 à 21:02
Bonjour,
ok, pour faire les 10000 lignes tu fais un programme de test avec une boucle.
Bonne chance pour la suite.

Cordialement. Bacterius !
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
15 déc. 2008 à 10:14
Merci pour ces commentaires.

@Bacterius:
J'ai tendance à nommer certaines de mes variables locales ou paramètres de fonctions avec des "_", pour les distinguer des variables globales. Ceci dit, je comprends que tu ne trouves pas ça très "beau"... et le simple fait que ça te rappelle les variables windaube m'incite à modifier ma façon de les nommer!!

Pour ce qui est de la démo, j'avoue que j'avais pas envie de me taper un fichier de 500 (ou 10000) lignes à la mano juste pour l'exemple!

L'utilisateur peut choisir le nombre de fichiers téléchargés simultanément: il y a un TEdit qui sert à ça. Cette valeur (MaxDL=4), c'est juste une valeur arbitraire par défaut au cas ou l'utilisateur ne renseignerait pas le TEdit... même chose pour le répertoire de base par défaut. Cette appli répond d'abord à un besoin personnel, donc je me suis pas pris la tête à sortir ces paramètres (dans un fichier ini, par exemple), mais libre à chacun de faire la modif.

Pour ce qui est du TObjectList, je ne l'ai encore jamais utilisé..mais je te remercie, je vais regarder ça de + près quand j'aurai un moment.

@+.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
12 déc. 2008 à 17:35
procedure TFormMain.BtnOpenTxtClick(Sender: TObject);
var
buff, _url, _dest: String;
_lst: TStringList;
begin
OpnDlg.Filter:= 'Fichier CSV|*.csv';
if OpnDlg.Execute then
begin
//Initialisation
LblTemps.Caption:= 'Temps total: ';
t0:= GetTime;
DLTotal:=0;
AssignFile(fic, OpnDlg.FileName);
Reset(fic);
BtnPause.Enabled:= True;
_lst:= TStringList.Create;
DLTotal:=0;
RepDL:= EdtDest.Text;
//Traitement du fichier
while not eof(fic) do
begin
Readln(fic, buff);
Tokenize(_lst, buff, ';');
//Construction des noms de fichiers source et destination
_url:= _lst.Strings[0];
_dest:= StringReplace(_lst.Strings[1], '/', '\', [rfreplaceall]);
if MidStr(_dest, Length(_dest), 1)<>'\' then
_dest:= _dest + '\';
_dest:= repDL + _dest + _lst.Strings[2];
//Download
while (DLCourants>=GetMaxDL) or Pause do
Application.ProcessMessages;
ShowTime;
GetFichier(_url, _dest);
_lst.Clear;
end;
CloseFile(fic);
_lst.Free;
BtnPause.Enabled:= False;
end; // end if OpnDlg
end;
_______________________________

Evite les "_" devant les variables, c'est pas beau, ça fait penser à des types Windows (en effet, la plupart des types natifs de programmation Windows qui nous sont transmis par Windows.pas sont écrits de la sorte "_TokenPrivilege" par exemple)

Sinon personnellement les algorithmes d'itération intelligente m'ont toujours fasciné (par exemple mettre dans un fichier texte "TuFaisCa20FoisAvecLaVariable[x=index d'iteration]".
Néanmoins ici, beaucoup de code pour une démonstration un peu légère ... tu aurais pu encore faire ressortir les avantages de ce genre de procédé en mettant une liste de 10000 fichiers (peu importe si les URL sont faux, de toute façon on les téléchargera pas tous), et montrer la comparaison fichier "brut" et fichier "intelligent" ^^
Parce que pour 20 fichiers, bon ... avec les ordis actuels on est pas à 1 Ko près ^^

Ensuite :

"MaxDL= 4; //nombre maximum de DL simultanés par défaut"

Ca serait bien de laisser l'utilisateur choisir en fonction de son débit, de ce qu'il faut, par exemple entre 2 et 10 (pas plus, sinon Windows va le sentir).
Une constante est utilisée pour stocker une valeur qui ne changera jamais : ici, l'utilisateur se sentira frustré s'il ne peut pas télécharger ses photos 5 par 5 ... lol ^^

"repDLDef='C:\Downloads\';"

Même remarque.

Et puis si tu as du temps à perdre, penses à TObjectList (ajoute Contnrs en unité interface), c'est beaucoup plus utile et cool que les "array of type", et mieux sécurisé au niveau de la mémoire et tout).

Voilà, bon courage, je n'ai pas testé mais je pense que c'est pas mal ;)

Cordialement, Bacterius !
offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009
12 déc. 2008 à 09:27
Bonjour,
C bien Comme application
Je pense que le niveau débutant n'est pas bien attribuer donc je vous donne 7/10
Bonne continuation
BY OFFLAKE
Rejoignez-nous