Descărcați fișiere de pe Internet - articole

Descărcați fișiere de pe Internet

Sarcină: descărcați fișierul prin http în directorul specificat utilizând fluxul.

Am aruncat pe formularul două TEdit, TProgressBar, un buton și TSaveDialog.

Descărcați fișiere de pe Internet - articole

Pentru buton se scrie un mic handler:

Acum, pe formular, adăugăm IdHTTP și butonul (Button2) cu inscripția "Start download".

În timp ce așteptăm cu mâna și scrie cea mai complicată - clasa pentru fire.

Primele două linii sunt făcute astfel încât să puteți vedea unde să introduceți codul. Apăsați Ctrl + Shift + C. Delphi va adăuga un cod. Acum va arăta astfel:

tip
TDownLoader = clasă (TThread)
privat
FToFolder: șir;
FURL: șir;
protejat
procedura Execute; suprascrie;
publicat
public
URL-ul proprietății: șir citit FURL write FURL;
proprietatea ToFolder: șir citit FToFolder scrie FToFolder;
se încheie;

Componenta idHTTP a fost distribuită pe formular pentru un singur scop - astfel încât Delphi a adăugat toate fișierele antetului la utilizări. Apoi poate fi ștearsă. Dar puteți scrie și fișierul idHTTP în utilizări.

Codul fluxului principal

Deci, codul de manipulare:

procedura TDownLoader.Execute;
var
http: TIdHTTP;
str: TFileStream;
începe
// Creați o clasă pentru încărcare
http: = TIdHTTP.Creați (zero);
// director unde să pui fișierul
ForceDirectories (ExtractFileDir (ToFolder));
// Stream pentru a salva
str: = TFileStream.Create (ToFolder, fmCreate);
încerca
// Leagăn
http.Get (url, str);
în cele din urmă
// Am fost învățați să ne curățăm
http.Free;
str.Free;
se încheie;

Rețineți că în această procedură nu puteți accesa direct componentele formularului și alte fire. Acest lucru se face într-un mod special, numit sincronizare.

În cele din urmă, handlerul pentru buton:

procedura TForm1.Button2Click (expeditor: TObject);
var d: TDownLoader;
începe
// Creați o clasă de thread.
// Se va opri debitul care va începe
d: = TDownLoader.Create (adevărat);
// Trimiteți parametrii fluxului
d.URL: = Edit1.Text;
d.ToFolder: = Edit2.Text;
/ / Firul trebuie să se îndepărteze la încheierea lucrării
d.FreeOnTerminate: = adevărat;
// Și rulați-l pentru descărcare.
d.Resume;
// Acum părăsim procedura, dar firul funcționează
// și își trăiește viața
se încheie;

Acum, codul nostru se poate descărca deja, dar nu avem niciun progres, nu există nicio notificare a finalizării descărcării.

Adăugați o notificare despre descărcare pentru începători. Adăugați următoarele în partea publică a formularului:

și apăsați pe Ctrl + Shift + C.

Va apărea un nou handler, pe care îl vom adăuga la o singură linie. Am doar un mesaj de pregătire. Rețineți că această procedură va fi apelată atunci când firul execută toate lucrările sale (procedura de execuție este finalizată). Numai în această procedură puteți accesa în același timp componentele și datele privind fluxul formularului.

Și adăugați apelul la dispozitivul de lansare a butonului de lansare:

/ / Firul trebuie să se îndepărteze la încheierea lucrării
d.FreeOnTerminate: = adevărat;
d.OnTerminat: = terTerminat;

Acum avem încă o problemă - să reînviem bara de progres. Dar aici suntem prinși într-un moment: din flux, nu vă puteți referi doar la componentele formularului. Mai exact, regula sună astfel: un fir nu poate accesa datele unui alt fir (variabile, cod) fără metode speciale. Există două astfel de metode. În primul rând, oprim un fir, iar cel de-al doilea în acest moment accesează variabilele sale. Sau al doilea fir îi cere primului să execute un anumit cod, în timp ce el adoarme la acel moment.

Metoda a doua, pe care o vom folosi - este un intermediar. Trimitem un mesaj intermediarului, astfel încât el îi spune celuilalt fir (sau poate grupului) că are ceva de făcut. Această metodă este bună deoarece firul poate procesa mesaje nu prin coerciție, ci dacă este posibil. Adică mesajele sunt în coada de așteptare. Ca intermediar, alegem chiar mediul Windows.

Deci, Windows trimite doi parametri întregi la trimiterea unui mesaj. Vom folosi primul ca identificator de acțiune, cel de-al doilea ca parametru suplimentar.

Să mergem mai departe. După utilizare înainte de introducerea liniei:

const
MY_MESS = WM_USER + 100;

procedura MyProgress (var msg: TMessage); mesajul MY_MESS;

Și prețuit Ctrl + Shift + C

În lucrarea proaspăt creată vom scrie:

Asta este, dacă ați trecut operațiunea de tip 0 - atunci trebuie să inițializați progresul. A trecut 1 - trebuie să setați poziția. Cum exact - este indicat în alt parametru (msg.LParam).

Și acum ne întoarcem la agenții IdHTTP, pe care i-am lăsat fără implementare. Acolo este necesar să introduceți numai în linie. Mai jos este implementarea.

procedura TDownLoader.IdHTTP1Work (ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Integer);
începe
PostMessage (Application.MainForm.Handle, MY_MESS, 1, AWorkCount);
se încheie;

procedura TDownLoader.IdHTTP1WorkBegin (ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Integer);
începe
PostMessage (Application.MainForm.Handle, MY_MESS, 0, AWorkCountMax);
se încheie;

Firește, există și alte modalități de a sincroniza totul. Dar această metodă mi se pare foarte simplă și de încredere, deoarece nu vor exista blocări, mesajele vor fi procesate cât mai mult posibil (pe cât posibil :-)).

Pentru a insera un link catre acest articol pe un alt site, folositi urmatorul cod HTML:

AJUTOR ȘI CUM SĂ REALIZAȚI CĂ DUPĂ CĂ FLUXUL ESTE COMPLETAT, CODUL DVS. A FOST FUL COMPLET. Și nu în general, așa cum se face în articol (procedura TForm1.thrTerminate (Expeditor: TObject);
începe
ShowMessage ("Efectuat");
se încheie;