Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2011, 20:38   #1
AlexMe
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 12
По умолчанию потоки

Необходимо параллельно производить загрузку страниц через прокси для дальнейшей обработки. Для каждого потока прокся своя. Потоки для меня темный лес (не программист я ). Можно даже простенький пример работы с потоками.
Код:
begin
...
IdHTTP1.ProxyParams.ProxyServer:=myserver1;
IdHTTP1.ProxyParams.ProxyPort:=myport1;
Memo1.Lines.Text:=IdHTTP1.get('MyLink');
...
end;
AlexMe вне форума Ответить с цитированием
Старый 16.07.2011, 01:32   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Потоки реализуются через наследование своего класса от TThread.
Перекрывается как минимум метод Execute(), который, собственно и будет выполняться в контексте нового потока. Т.е. код будет примерно такой:

Код:
unit ThreadedHTTP;

interface 

uses Classes;

type
  myThread = class(TThread)
  private
    f_uri: string;
  protected
    procedure Execute(); override;
  public
    constructor Create(const URI: string);
  end;

implementation

{ myThread }

procedure myThread.Execute(); 
begin
  while (not Terminated) do begin
    //
    //  тут загружаем страницу из f_uri, к VCL не обращаемся (или через Synchronize)
     // когда работа со страницей окончена, выходим из while
  end;
end;

constructor myThread.Create(const URI: string);
begin
  f_uri := URI;
  //
  inherited Create(False);
  //
  FreeOnTerminate := True;
end;

end.
Ну и вызывать это дело примерно так:

Код:
for i := 0 to count - 1 do
  myThread.Create(URI_Array[i]);
Т.е. в цикле создаём count потоков, каждому передаём свой адрес страницы для загрузки из массива URI_Array. По окончанию работы потока он освободит сам себя.

Если count > 20, то имеет смысл создать пул потоков и в него загонять новые адреса по мере скачки. Но это уже другая тема.

(ЗЫ. код не проверял, могут быть ошибки, тут скорее идея, чем готовый проект).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 16.07.2011 в 01:35.
veniside вне форума Ответить с цитированием
Старый 17.07.2011, 22:51   #3
AlexMe
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 12
По умолчанию

Для пробы кинул на форму 4 мемо и одну кнопку.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;

type

  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }

  public
    { Public declarations }

  end;

var
  Form1: TForm1;
  i:integer;
  uri: array [1..100] of string;
  prx: array [1..100] of string;
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
prx[1]:='172.186.27.39';
prx[2]:='172.188.170.244';
prx[3]:='172.206.146.51';
prx[4]:='128.176.59.3';
uri[1]:='http://www.programmersforum.ru/';
uri[2]:='http://www.programmersforum.ru/';
uri[3]:='http://www.programmersforum.ru/';
uri[4]:='http://www.programmersforum.ru/';
for i:=1 to 4 do begin
myThread.Create(uri[i]);
end;
end;

end.
Код:
unit Unit2;

interface

uses Classes,idHttp,unit1;

type
  myThread = class(TThread)
  private
    f_uri: string;
  protected
    procedure Execute(); override;
  public

    constructor Create(const URI: string);
  end;

implementation

uses  RTLConsts;

{ myThread }


procedure myThread.Execute();
var
H:array [1..100] of TIdHTTP;
begin
  while (not Terminated) do begin
  H[i]:=TIdHTTP.Create(nil);
  H[i].ProxyParams.ProxyServer:=prx[i];
  H[i].ProxyParams.ProxyPort:=1080;
  Form1.Memo1.text:=H[i].Get(f_uri);
     //
    //  тут загружаем страницу из f_uri, к VCL не обращаемся (или через Synchronize)
     // когда работа со страницей окончена, выходим из while
  end;
end;

constructor myThread.Create(const URI: string);
begin
  f_uri := URI[i];
  //
  inherited Create(False);
  //
  FreeOnTerminate := True;
end;

end.
Ничего не работает
AlexMe вне форума Ответить с цитированием
Старый 18.07.2011, 05:17   #4
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Многопоочное скачивание:

Unit1.pas
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    MyThread: array of TDownload;
    { Private declarations }
  public
    { Public declarations }
  end;

  TSetting = record
    ProxyServer: string;
    DownloadURL: string;
  end;
var
  Setting: array of TSetting;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  SetLength(MyThread, 2);

  for i := 0 to 1 do
    MyThread[i] := TDownload.Create(Setting[i].ProxyServer,
      Setting[i].DownloadURL);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(Setting, 2);

  Setting[0].ProxyServer := '11.22.33.44';
  Setting[0].DownloadURL := 'http://...';

  Setting[1].ProxyServer := '55.66.77.88';
  Setting[1].DownloadURL := 'http://...';
end;

end.
Unit2.pas
Код:
unit Unit2;

interface

uses
  Classes, IdHTTP;

type
  TDownload = class(TThread)
    constructor Create(const URL, Proxy: string);
  private
    FURL: string;
    FProxy: string;
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ TDownload }

constructor TDownload.Create(const URL, Proxy: string);
begin
  FURL := URL;
  FProxy := Proxy;
  FreeOnTerminate := True;
  inherited Create(False);
end;

procedure TDownload.Execute;
var
  IdHTTP: TIdHTTP;
begin
  IdHTTP := TIdHTTP.Create;

  {Настройки прокси сервера и все остальное}

  IdHTTP.Get('http://адрес.сайта/файл');

  IdHTTP.Free;
end;

end.
kangreon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
потоки Cpluser Общие вопросы .NET 5 15.02.2011 22:17
потоки Cpluser C# (си шарп) 0 14.02.2011 21:24
Потоки _-Re@l-_ Общие вопросы Delphi 6 18.01.2011 20:45
Потоки в С++ BioS Общие вопросы C/C++ 2 09.01.2010 21:34