ПредишенСледващото

Изтегляне на файлове от Интернет

Цел: Да свалите файла чрез HTTP в указаната папка с помощта на поток.

Хвърли под формата на две TEdit, TProgressBar, един бутон и TSaveDialog.

Изтегляне на файлове от Интернет - статия

За да напишете малък бутон манипулатор:

Сега, от формата и си поставете бутон IdHTTP (BUTTON2) с надпис "започне изтегляне".

С процесора да се изчака малко, и пише най-трудно - в класа на потока.

Първите две линии са направени, за да стане ясно, къде да въведете кода. И натиснете Ctrl + Shift + C. Delphi добавя малко код. Той вече ще изглежда така:

тип
TDownLoader = клас (TThread)
частен
FToFolder: низ;
Навивам: низ;
защитени
Изпълнение процедура; отменят;
публикувано
обществен
имот URL: низ прочетете Навивам запис Навивам;
имот ToFolder: низ прочети FToFolder напиши FToFolder;
приключи;

idHTTP компонент бе хвърлен във формуляра с една единствена цел - да се добавят всички Delphi заглавните файлове в употреба. След това тя може да бъде премахната. Но можете да се влиза в употреба подават idHTTP.

Основният поток от код

Така че, кодът за манипулатор:

процедура TDownLoader.Execute;
Var
HTTP: TIdHTTP;
ул: TFileStream;
започвам
// създаване на клас за сваляне
HTTP: = TIdHTTP.Create (нула);
// директория, в която да поставите файла
ForceDirectories (ExtractFileDir (ToFolder));
// поток, за да запазите
ул: = TFileStream.Create (ToFolder, fmCreate);
опитвам
// Изтеглянето
http.Get (URL адрес, ул);
накрая
// Ние сме научени да се четка за
http.Free;
str.Free;
приключи;

Имайте предвид, че тази процедура не може да имат директен достъп до компонентите на формата и другите нишки. Това се прави по специален начин, който се нарича синхронизация.

На последно място, водачът на бутона:

процедура TForm1.Button2Click (Sender: TObject);
Var г: TDownLoader;
започвам
// Създаване на клас поток.
// поток, за да започнете, ще бъде спрян
г: = TDownLoader.Create (истина);
// ни вижте параметрите на потока
d.URL: = Edit1.Text;
d.ToFolder: = Edit2.Text;
// поток трябва да се премахне при завършване на работата им
d.FreeOnTerminate: = вярно;
// и да го стартирате по изтеглянето.
d.Resume;
// Сега ние ще оставим процедура, но потокът на работа
// и живеят живота си
приключи;

Сега, нашият код може да се наложи да се люлее, но няма напредък, има предупреждение за сваляне завършване.

Добави в началото на съобщението за изтегляне. Добави в публичната част на формата добавете следния ред:

и кликнете следващия Ctrl + Shift + C.

Това ще бъде нов процесор, който допълни един ред. Нося съобщение на готовност. Не забравяйте, че тази процедура ще се нарича, когато нишката ще изпълни всичките си работи (приключила процедура изпълнение). Само в тази процедура може едновременно достъп до компонентите и поток от данни форми.

И това ще добави повикване бутон манипулатор старт:

// поток трябва да се премахне при завършване на работата им
d.FreeOnTerminate: = вярно;
d.OnTerminate: = thrTerminate;

Сега ни остава друг проблем - да съживи лентата за напредъка. Но тук причаква за нас едно нещо: по течението не може просто да се отнасят до компонентите на формата. По-конкретно, правилото е: един единствен поток няма достъп до данните на друг поток (променлива, код) без специални техники. Такива методи са две. Първият - да спрем една нишка и втори път върху него, за да получите достъп до нейните променливи. Или втория поток първо иска да изпълни част от кода, и времето, което отива да спи.

Метод две, които ние използваме - е посредник. Изпращаме посредник съобщение, че той каза на друга тема (или дори група), така че той е направил нещо. Този метод е добър, защото може да се справи с потока от съобщения не са принудени, но, доколкото е възможно. Това е, съобщенията ще се стопи на място. Като посредник ще изберем самата среда на Windows.

Така че, Windows при изпращане на съобщение ви позволява да изпращате двете целочислени параметри. Първо, ние ще използваме като идентификатор на действие, а вторият - като допълнителен параметър.

Да вървим по-нататък. След използва, за да вмъкнете тип низ:

конст
MY_MESS = WM_USER + 100;

процедура MyProgress (Var MSG: TMessage); съобщение MY_MESS;

И заветната Ctrl + Shift + C

В новосъздадената манипулатор, пиша това:

Това означава, че ако се премине от вида на операцията 0 - означава, че е необходимо да се инициализира напредъка. Изпратен 1 - трябва да настроите позицията. Как точно - се посочва в друг параметър (msg.LParam).

И сега обратно към нашите товарачи IdHTTP, ние сме останали без изпълнение. Там трябва да въведете всички линия. По-долу показва изпълнението.

процедура TDownLoader.IdHTTP1Work (ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: цяло число);
започвам
PostMessage (Application.MainForm.Handle, MY_MESS, 1, AWorkCount);
приключи;

процедура TDownLoader.IdHTTP1WorkBegin (ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: цяло число);
започвам
PostMessage (Application.MainForm.Handle, MY_MESS, 0, AWorkCountMax);
приключи;

Естествено, има няколко начина да се синхронизират всичко. Но този метод изглежда много просто и надеждно, тъй като там ще се блокира, съобщенията ще бъдат обработвани възможно най-много (за най-добър :-)).

За да поставите препратка към тази статия на друг сайт, използвайте следната HTML-кода:

ПОМОЩ И КАК да осъзнаят, че когато потокът изпълнява своята код за всеки един от изтегления файл. НЕ В общи линии, ЧЛЕН Произведено в (процедура TForm1.thrTerminate (Sender: TObject);
започвам
ShowMessage ( "готов");
приключи;

Подкрепете проекта - споделете линка, благодаря!