[delphi] TThread

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by InfectedM, 22 Jan 2010.

  1. InfectedM

    InfectedM Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    155
    Likes Received:
    12
    Reputations:
    0
    Только начал разбираться с потоками,нашел примерчик ,изменил чуть под себя и вот что получилось:
    Программа скачивает в 3 потоках странички через Idhttp,но как я понял она их скачивает не паралельно а последовательно.

    мне нужно написать программу каторая будет распозновать 20 капч одновременно в 20 потоках.

    тоесть:
    1) Скачиваю странику,получаю капчу,пока идет распознование(занимает 15 сек) скачиваю другую страничку и так далее...
    После того как на всех потоках скачались странички и капча распознана к ним мы должны пройтись по ним ,собрать с каждого потока уже распознанную капчу и закрыть поток.


    что нужно поправить и как вообще это делается подскажите плиз
    Code:
    unit Unit1;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, XPMan, ComCtrls,idhttp;
    
    type
    TForm1 = class(TForm)
    Button2: TButton;
    
    Button4: TButton;
    
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    
    procedure Button4Click(Sender: TObject);
    
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    
    type
    TMyPotok = class(TThread)
    private
    { Private declarations }
    protected
    procedure execute; override;
    end;
    
    Const
    MaxPotoks = 6;
    
    var
    Form1: TForm1;
    MyPotokX: Array [0..10] of TMyPotok;
    myidHTTP :Array [0..10] of TidHTTP;
    myOtvet:Array [0..10] of TStringList;
    I_potok: Integer;
    
    implementation
    
    {$R *.dfm}
    
    Procedure TMyPotok.execute;
    VAR
    i: Integer;
    begin
    
    MessageBox(0,'сыр сыр сыр!!!', nil, 0);
    myOtvet[I_potok].Text:=myidHTTP[I_potok].Get('http://ya.ru/');
    //getCapcha;    // тут будет функцию распозновании капчи (распознает 10 секунд) 
    
    myOtvet[I_potok].SaveToFile(inttostr(random(999))+'.html');
    Application.ProcessMessages;
    End;
    
    
    
    
    procedure TForm1.Button2Click(Sender: TObject);
    VAR
    i: integer;
    I_potok:integer;
    begin
    
    for I_potok:=0 to 2 do begin
    myidHTTP[I_potok] := TidHTTP.Create(nil);
    myOtvet[I_potok]:= TStringList.Create;
    MyPotokX[I_potok]:= TMyPotok.create(true);
    MyPotokX[I_potok].FreeOnTerminate:= True;
    MyPotokX[I_potok].Priority:= tpLowest;
    
    end;
    
    
    
    
    try
    For i:=0 to 2 do MyPotokX[i].Resume;
    except
    exit;
    end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    I_potok:=0;
    end;
    
    
    
    procedure TForm1.Button4Click(Sender: TObject);
    begin
    I_potok:= 0;
    end;
    
    
    
    end.
     
    #1 InfectedM, 22 Jan 2010
    Last edited: 22 Jan 2010
  2. InfectedM

    InfectedM Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    155
    Likes Received:
    12
    Reputations:
    0
    при нажатии на кнопку создаеться столько потоков сколько существует записей в memo1

    допустим я создал 50 потоков.
    1)как мне остановить вручнудю все эти 50 потоков и удалить их?
    2)чтобы потоки удалились нужно в конце писать self.Terminate; self.free; ? или он сам удаляеться
    3)как остановить например только 10-ый поток?
    подскажите пожалуйса.


    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
    begin
      for i := 0 to Memo1.Lines.Count - 1 do begin
        TMyThread.Create(false, Memo1.lines[i]);
      end;
    end;
    

    Code:
    
     type
     TMyThread = class(TThread)
      private
        FUrl: string;
      public
        constructor Create(CreateSuspended: Boolean; AUrl: string);
      protected
        procedure Execute; override;
        procedure UpdateCaption;
      end;
    
    implementation
    
    uses Unit1;
    
    
    
    constructor TMyThread.Create(CreateSuspended: Boolean; AUrl: string);
    begin
      inherited Create(CreateSuspended);
      FUrl := AUrl;
      FreeOnTerminate := true;
    end;
    
    procedure TMyThread.Execute;
    var
      http: TIdHTTP;
      str: TStringList;
    begin
    str := TStringList.Create();
      http := TIdHTTP.Create(nil);
      str.Text:= http.Get(FUrl);
    
        sleep(7000);
          str.SaveToFile(inttostr(random(222))+'.html');
          
      http.Free;
      str.free ;
      Synchronize(UpdateCaption);
      // self.Terminate;
         //self.free;
    end;
    
    procedure TMyThread.UpdateCaption;
    begin
      Form1.Memo2.Lines.Add(FUrl);
    end;
    
     
    #2 InfectedM, 22 Jan 2010
    Last edited: 23 Jan 2010