Конференция "Начинающим" » Потоки как работать параллельно [D7, WinXP]
 
  • nonameee (22.01.10 18:57) [0]
    Только начал разбираться с потоками и вот что получилось:
    Программа скачивает в 3 потоках странички через Idhttp,но как я понял она их скачивает не паралельно а  последовательно.

    мне нужно написать программу каторая будет скачивать 20 страничек и каждую из этих страничек нужно пропарсить функцией Getkapcha (выполнение этой функции занимает 30-40 секунд)
    тоесть:
    1) Скачиваю странику,вызываю функцию getkapcha,Пока выполняеться эта функция  нужно как-то запустить второй поток после чего запустить во 2-ом потоке скачивание странички и запустить функцию getkapcha итд...
    думаю вы поняли меня :)

    После того как на всех потоках скачались странички  и функция отпарсила текст (функция getkapcha ,каторая выполняеться 30 сек) нужно закрыть все потоки

    что нужно поправить  и как вообще это делается подскажите пожалуйста
    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

    myOtvet[I_potok].Text:=myidHTTP[I_potok].Get('http://ya.ru/');
    //###################################################################
    //getCapcha;    // тут будет функция ,каторая будет выполняться 30 секунд!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //###################################################################
    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.

  • Стенка © (23.01.10 01:44) [1]
    А ты, часом, не спамер?
  • Германн © (23.01.10 01:54) [2]

    >
    > Procedure TMyPotok.execute;
    > VAR
    > i: Integer;
    > begin
    >
    > myOtvet[I_potok].Text:=myidHTTP[I_potok].Get('http://ya.
    > ru/');
    > //###################################################################
    > //getCapcha;    // тут будет функция ,каторая будет выполняться
    > 30 секунд!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    > //###################################################################
    > myOtvet[I_potok].SaveToFile(inttostr(random(999))+'.html');
    >
    > Application.ProcessMessages;
    > End;
    >

    А вот нахрена в доппотоке Application.ProcessMessages? Просто интересно.
  • вкпкуп (23.01.10 02:35) [3]
    спамер:D

    вопрос решен,сорри за беспокойство.

    unit Unit2;

    interface

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

    type
    TMyThread = class(TThread)
     private
       FUrl: string;
     public
       constructor Create(CreateSuspended: Boolean; AUrl: string);
     protected
       procedure Execute; override;
       procedure UpdateCaption;
     end;

    implementation

    uses Unit1;

    { Important: Methods and properties of objects in visual components can only be
     used in a method called using Synchronize, for example,

         Synchronize(UpdateCaption);

     and UpdateCaption could look like,

       procedure TMyThread.UpdateCaption;
       begin
         Form1.Caption := 'Updated in a thread';
       end; }


    { TMyThread }

    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);
     str.SaveToFile(inttostr(random(222))+'.html');
     http.Free;
     str.free ;
       sleep(5000);
     Synchronize(UpdateCaption);

    end;

    procedure TMyThread.UpdateCaption;
    begin
     Form1.Memo2.Lines.Add(FUrl);
    end;

    end.

  • Германн © (23.01.10 02:54) [4]

    > вопрос решен,сорри за беспокойство.
    >

    Гугль - великое подспорище!
    Вся проблема только в выборе варианта ответа. :)
  • Anatoly Podgoretsky © (23.01.10 14:11) [5]
    > Германн  (23.01.2010 02:54:04)  [4]

    Не, вопроса.
 
Конференция "Начинающим" » Потоки как работать параллельно [D7, WinXP]
Есть новые Нет новых   [134433   +22][b:0][p:0.002]