Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки как работать параллельно [D7, WinXP]


nonameee ©   (2010-01-22 18:57:00) 

Только начал разбираться с потоками и вот что получилось:
Программа скачивает в 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.


Anatoly Podgoretsky   (2010-01-23 14:11:00) [1]

> Германн  (23.01.2010 02:54:04)  [4]

Не, вопроса.


Германн   (2010-01-23 02:54:00) [2]


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

Гугль - великое подспорище!
Вся проблема только в выборе варианта ответа. :)


вкпкуп   (2010-01-23 02:35:00) [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 01:54:00) [4]


>
> 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 01:44:00) [5]

А ты, часом, не спамер?


Наверх

Титульная страница Поиск, карта сайта Написать письмо