Показать сообщение отдельно
  #1  
Старый 13.07.2016, 14:59
JapanStyle JapanStyle вне форума
Прохожий
 
Регистрация: 06.11.2015
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Потоки в поиске файлов на ftp (Indy)

Всем доброго времени суток. Сделал программульку для поиска файлов заданного расширения на ресурсе. Однако анализ всех, порядка 125 тыс. файлов занимает довольно продолжительное время. Вычитал, что поможет решить задачу применение потоков. Пните, подскажите, укажите что-куда-чего-кому, ибо первый раз встречаюсь с таким.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, HTTPApp, HTTPProd, MSHTML, ActiveX,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdFTP,Wininet, IdFTPCommon, IdFTPList,
  IdAntiFreezeBase, IdAntiFreeze;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Edit3: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Edit4: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    WebBrowser1: TWebBrowser;
    IdFTP1: TIdFTP;
    Button4: TButton;
    Label12: TLabel;
    IdAntiFreeze1: TIdAntiFreeze;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Procedure PoiskIndy(var Schet1,Schet2,Schet3:integer; dir:string);
  end;

var
  Form1: TForm1;
  S1,S2,S3:integer;
implementation

{$R *.dfm}
 uses unit2;

procedure TForm1.FormCreate(Sender: TObject);
begin
S1:=0;S2:=0;S3:=0;
end;


Procedure TForm1.PoiskIndy(var Schet1,Schet2,Schet3:integer; dir:string);     
var i,q:integer;f,a1:string; LS:TStrings;
begin
idftp1.ChangeDir(dir);
idftp1.List(nil);
Listbox1.Items.Add(idftp1.RetrieveCurrentDir);
if  idftp1.DirectoryListing.Count =0 then begin idftp1.ChangeDirUp; end;

for i:=0 to idftp1.DirectoryListing.Count-1 do begin
if (idftp1.DirectoryListing.Items[i].ItemType = ditdirectory) then
    begin
    a1:=idftp1.DirectoryListing.Items[i].Filename;
    PoiskIndy(Schet1,Schet2,Schet3,a1);
    end;

  if (ExtractFileExt(idftp1.DirectoryListing.Items[i].FileName)=Form1.Edit2.text) or (ExtractFileExt(idftp1.DirectoryListing.Items[i].FileName)=Edit3.text) then begin
  ListBox1.Items.Add(idftp1.DirectoryListing.Items[i].FileName);
  if (ExtractFileExt(idftp1.DirectoryListing.Items[i].FileName)=Edit2.text) then Schet1:=Schet1+1;
  if (ExtractFileExt(idftp1.DirectoryListing.Items[i].FileName)=Edit3.text) then Schet2:=Schet2+1;
  end;
  Schet3:=Schet3+1;
  end;

idftp1.ChangeDirUp;
idftp1.List(nil);
s1:=schet1;s2:=schet2;s3:=schet3;
end;

procedure TForm1.Button4Click(Sender: TObject);
var a:string;
begin
a:=Edit1.text;
idftp1.Host:='mirror.yandex.ru'; idftp1.Username:='Anonymous'; idftp1.Password:='';
idftp1.Port:=21; idftp1.Connect;

PoiskIndy(s1,s2,s3,a);
Label1.Caption:=IntToStr(s1); Label10.Caption:=IntToStr(s2); Label11.Caption:=IntToStr(s3);
if Assigned(idftp1) then idftp1.Disconnect;
end;
Ответить с цитированием