Форум: "Начинающим";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
ВнизПотоки как работать параллельно Найти похожие ветки
← →
nonameee (2010-01-22 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.
← →
Стенка © (2010-01-23 01:44) [1]А ты, часом, не спамер?
← →
Германн © (2010-01-23 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? Просто интересно.
← →
вкпкуп (2010-01-23 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.
← →
Германн © (2010-01-23 02:54) [4]
> вопрос решен,сорри за беспокойство.
>
Гугль - великое подспорище!
Вся проблема только в выборе варианта ответа. :)
← →
Anatoly Podgoretsky © (2010-01-23 14:11) [5]> Германн (23.01.2010 02:54:04) [4]
Не, вопроса.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c