Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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;
Ответить с цитированием
  #2  
Старый 15.07.2016, 04:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если сервер поддерживает несколько соединений с одного клиента, то можно при нахождении новой папки помещать ее в очередь на анализ, завести несколько потоков, которые будут просто брать имена папок из очереди и проверять файлы (при нахождении новой папки - ее в очередь). Потоки надо будет только свои делать, которые будут сигнализировать - работают они или нет. Подключение - свое в каждом потоке. И не забыть сделать синхронизацию между потоками.

ЗЫ. Немного сумбурно... но код писать лень.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter