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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2009, 12:06   #1
newmister
Пользователь
 
Регистрация: 30.01.2009
Сообщений: 18
По умолчанию Многопоточность.

Приветствую.
Пишу прокси чекер. Необходимо реализовать многопоточность проверки (как во всех нормальных чекерах). Получилось только сделать отдельный поток для проверки, но проверяется по 1 прокси. Вопрос: как сделать, чтобы одновременно проверял 2,3 или 10 прокси?

Код:
unit x;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    IdHTTP1: TIdHTTP;
    Edit1: TEdit;
    Button2: TButton;
    XPManifest1: TXPManifest;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TCheckThread = class(TThread)
  private
    str:string;
  protected
    procedure UpdateForm;
    procedure Execute; override;
    procedure ThreadsCount;
  public
    constructor create(createsuspennded: boolean; const proxy: string);
  end;

var
  Form1: TForm1;
  threads:integer=0;
  line:integer=0;
  CheckThread:TCheckThread;

implementation

{$R *.dfm}
constructor TCheckThread.create(createsuspennded: boolean; const proxy: string);
begin
inherited create(createsuspennded);
str:=proxy;
end;

procedure TCheckThread.Execute;
var prov:string;
begin
Form1.IdHttp1.ProxyParams.ProxyServer:=copy(str,1,pos(':',str)-1);
Form1.IdHttp1.ProxyParams.ProxyPort:=StrToInt(copy(str,pos(':',str)+1,length(str)-pos(':',str)));
try
 Form1.IdHttp1.ReadTimeout:=strtoint(form1.edit1.Text);
 prov:=Form1.Idhttp1.get('smallwedsite');
  if prov<>'' then Synchronize(UpdateForm);
 except

 end;
  Form1.IdHttp1.Disconnect;
  Synchronize(ThreadsCount);
end;

procedure TCheckThread.UpdateForm;
begin
Form1.memo2.Lines.Add(str);
end;

procedure TCheckThread.ThreadsCount;
begin
threads:=threads-1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=True;   //time=200
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Clear;
Memo2.Clear;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
If threads=0 then
  begin
  threads:=threads+1;
  CheckThread:=TCheckThread.Create(False,memo1.Lines[line]);
  inc(line);
  end;
if line=memo1.Lines.Count then
  begin
  Timer1.Enabled:=false;
  line:=0;
  end;

end;

end.
newmister вне форума Ответить с цитированием
Старый 23.07.2009, 12:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Я бы обьединил IdHttp и TThread в один класс. Создал массив эких классов и запустил бы все, и пусть они независимо друг от друга работают со своими адресами.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.07.2009, 16:08   #3
newmister
Пользователь
 
Регистрация: 30.01.2009
Сообщений: 18
По умолчанию

Мысль хорошая.
Как в Делфи наследовать от 2х классов?
В Си просто, указать родителей через запятую, а в делфи что то не нашел как(
newmister вне форума Ответить с цитированием
Старый 23.07.2009, 16:25   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Нафига наследовать от двух классов? IdHttp включить как член класса
Black Fregat вне форума Ответить с цитированием
Старый 23.07.2009, 18:14   #5
newmister
Пользователь
 
Регистрация: 30.01.2009
Сообщений: 18
По умолчанию

а, окей) пошел делать)
newmister вне форума Ответить с цитированием
Старый 23.07.2009, 18:48   #6
newmister
Пользователь
 
Регистрация: 30.01.2009
Сообщений: 18
По умолчанию

Изменил свой класс:
Код:
type
  TCheckThread = class(TThread)
    IdHTTP1: TIdHTTP;
    str:string;
  private

  protected
    procedure UpdateForm;
    procedure Execute; override;
    procedure ThreadsCount;
  public
    constructor create(createsuspennded: boolean; const proxy: string);
  end;
В остальном все также, только в процедурах вместо Form1.IdHTTP1... оставил IdHTTP1...

в итоге вылетает на строке
Код:
IdHttp1.ProxyParams.ProxyServer:=copy(str,1,pos(':',str)-1);
с ошибкой
newmister вне форума Ответить с цитированием
Старый 23.07.2009, 20:27   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а при создании потока idhttp1:=TidHTTP.Create(nil);
не забыл?
(обьекты то создавать сначало надо, а потом использовать)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.07.2009, 22:51   #8
newmister
Пользователь
 
Регистрация: 30.01.2009
Сообщений: 18
По умолчанию

Забыл. thx
newmister вне форума Ответить с цитированием
Старый 23.07.2009, 23:27   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

и в деструкторе не забудьте освобождать(Free)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.07.2009, 12:54   #10
newmister
Пользователь
 
Регистрация: 30.01.2009
Сообщений: 18
Вопрос

Код:
unit checkunit;

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Edit1: TEdit;
    Button2: TButton;
    XPManifest1: TXPManifest;
    Timer1: TTimer;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TCheckThread = class(TThread)
    IdHTTP1: TIdHTTP;
    str:string;
  private

  protected
    procedure UpdateForm;
    procedure Execute; override;
    procedure ThreadsCount;
  public
    constructor create(createsuspennded: boolean; const proxy: string);
    destructor Destroy; override;
  end;

var
  Form1: TForm1;
  threads:integer=0;
  line:integer=0;
  TC:integer=0;
  CheckThread:array[0..9] of TCheckThread;

implementation

{$R *.dfm}
constructor TCheckThread.create(createsuspennded: boolean; const proxy: string);
begin
inherited create(createsuspennded);
str:=proxy;
idhttp1:=TidHTTP.Create(nil)
end;

destructor TCheckThread.Destroy;
begin
IdHTTP1.Free;
inherited destroy;
end;

procedure TCheckThread.Execute;
var prov:string;
begin
IdHttp1.ProxyParams.ProxyServer:=copy(str,1,pos(':',str)-1);
IdHttp1.ProxyParams.ProxyPort:=StrToInt(copy(str,pos(':',str)+1,length(str)-pos(':',str)));
try
 IdHttp1.ReadTimeout:=strtoint(form1.edit1.Text);
 prov:=Idhttp1.get('http://new-mister.narod.ru/test.html');
  if prov<>'' then Synchronize(UpdateForm);
 except

 end;
  IdHttp1.Disconnect;
  Synchronize(ThreadsCount);
end;

procedure TCheckThread.UpdateForm;
begin
Form1.memo2.Lines.Add(str);
end;

procedure TCheckThread.ThreadsCount;
begin
threads:=threads-1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=True;   //time=200
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Clear;
Memo2.Clear;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
If threads=0 then
  begin
  for i:=1 to 10 do
    begin
    if memo1.Lines[line]<>'' then
      CheckThread[threads]:=TCheckThread.Create(False,memo1.Lines[line])
      else break;
    inc(line);
    threads:=i;
    end;
  end;
if line=memo1.Lines.Count then
  begin
  Timer1.Enabled:=false;
  line:=0;
  end;

end;

end.
Сие чудо выкидывает Висту в синий экран.. Где то после отработки procedure TForm1.Timer1Timer(Sender: TObject)
newmister вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность Neymexa Помощь студентам 3 13.04.2010 11:43
Многопоточность PUH Помощь студентам 3 06.06.2009 13:54
Многопоточность Indy AVer Работа с сетью в Delphi 14 14.02.2009 22:10
Многопоточность в BCB6 Linky Общие вопросы C/C++ 1 06.02.2009 10:44
Многопоточность с INDY Ragnarek Работа с сетью в Delphi 2 27.01.2009 13:25