PDA

Просмотр полной версии : INDY в поток.


Akapel
22.08.2009, 19:26
Привет всем. Нужна помощь в реализации POST запроса к сайту многопоточно.

unit Unit13;

interface

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

type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

tnew = class(tthread)
private
s:string;
{ private declarations }
procedure addstr;
protected
procedure execute; override;
end;
var
Form1: TForm1;
http1:tidhttp;
a:longint;
IdHTTP1: TIdHTTP;
new1, new2: tnew;
implementation

{$R *.dfm}



procedure tnew.addstr;
var params,responseres:tstringlist;
label method;
begin
params:=TStringList.Create;
responseres:=TStringList.Create();
idhttp1:=TidHTTP.Create(nil);
try

//здесь параметры

responseres.text:=IDHTTP1.Post('Сайт',params);

//Тут идет условие и отсылка в мемо

finally
params.free;
responseres.free;
responseres:=nil;
params:=nil;
end;

end;

procedure tnew.execute;
begin
synchronize(addstr);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
new1 := tnew.create(true);
new1.freeonterminate := true;
new1.s := '1 thread';
new1.priority := tplowest;
new2 := tnew.create(true);
new2.freeonterminate := true;
new2.s := '2 thread';
new2.priority := tptimecritical;
new1.resume;
new2.resume;
end;

end.


Я попытался реализовать это в два потока, но отправка POST все равно идет по очереди, т.е. пока первый запрос не выполнится, второй не пойдет.
Подскажите, как лучше реализовать?

flacs
22.08.2009, 22:22
type
PSTRUCT = ^STRUCT;
STRUCT = record
i,j: cardinal;
end;


var
tid: cardinal;
SLemail, SLpass: TstringList;

procedure Multi(param: Pointer); stdcall;
var
first, second: cardinal;
full: string;
begin
first:=integer( PSTRUCT(param).i);
second:=integer( PSTRUCT(param).j);
MessageBox(0,Pchar(SLEmail.Strings[first]),Pchar(SLpass[second]),0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,j: integer;
_struct: PSTRUCT;
begin
SLEmail:=TStringList.Create; SLEMail.Clear;
SLpass:=TStringList.Create; SLPass.Clear;
SLEmail.Add('1@mail.ru');
SLEmail.Add('2@mail.ru');
SLpass.Add('password1'); SLPass.Add('password2');
for i:=0 to SLEmail.Count -1 do
for j:=0 to SLPass.Count -1 do begin
Application.ProcessMessages;
New(_struct);
_struct^.i:=i; _struct^.j:=j;
createthread(nil,0,@Multi,_struct,0,tid);
end;
end;





Создаются потоки, и в каждом потоке создается мессаг содержащий email; password, которые занесены в список. Процедура Multi обработчик потока, модифицируй его по своему усмотрению. С indy не пробал, т.ч., попробуй так, если даже щас будут задержки, то придется писать POST запрос на сокетах...

Akapel
22.08.2009, 22:54
Ок, щас попробую) тему пока не закрывайте.