Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 19:23   #1
infected0820
Новичок
Джуниор
 
Регистрация: 22.01.2010
Сообщений: 3
По умолчанию Потоки, параллельно

Только начал разбираться с потоками и вот что получилось:
Программа скачивает в 3 потоках странички через Idhttp,но как я понял она их скачивает последовательно (можно что-нибудь как-нибудь сделать, чтобы скачивались страничку параллельно то есть одновременно?

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


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


что нужно поправить и как вообще это делается подскажите пожалуйста :angel
Код:
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.
infected0820 вне форума Ответить с цитированием
Старый 22.01.2010, 22:29   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

создайте у каждого потока свой idHTTP.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.01.2010, 00:46   #3
infected0820
Новичок
Джуниор
 
Регистрация: 22.01.2010
Сообщений: 3
По умолчанию

разобрался вроде...
Код:
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.
infected0820 вне форума Ответить с цитированием
Старый 23.01.2010, 16:06   #4
infected0820
Новичок
Джуниор
 
Регистрация: 22.01.2010
Сообщений: 3
По умолчанию

при нажатии на кнопку создаеться столько потоков сколько существует записей в memo1

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


Код:
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;

Код:

 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;
infected0820 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки в С++ BioS Общие вопросы C/C++ 2 09.01.2010 21:34
Хотелось бы параллельно с Дэлфи, учить еще какой нибудь язык... Бегиннер Свободное общение 2 26.11.2008 18:20
Потоки в С Raptor Помощь студентам 1 07.01.2008 21:12