INDY в поток.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Akapel, 22 Aug 2009.

  1. Akapel

    Akapel New Member

    Joined:
    15 Dec 2008
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    Привет всем. Нужна помощь в реализации POST запроса к сайту многопоточно.
    Code:
    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 все равно идет по очереди, т.е. пока первый запрос не выполнится, второй не пойдет.
    Подскажите, как лучше реализовать?
     
  2. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    Code:
    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 запрос на сокетах...
     
    #2 flacs, 22 Aug 2009
    Last edited: 22 Aug 2009
  3. Akapel

    Akapel New Member

    Joined:
    15 Dec 2008
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    Ок, щас попробую) тему пока не закрывайте.