![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Прошу у вас помощи.
Суть такова: Создаются 5 потоков с таким вот кодом Код:
procedure Searcher.Execute;
var
i: integer;
begin
FHTTPS := THTTPSend.Create;
FLIST := TStringList.Create;
FHTML := TStringList.Create;
FRegExp := TRegExpr.Create;
try
for i := 0 to 5 do
begin
setheaders;
FHTTPS.HTTPMethod('GET', URL + inttostr(i));
begin
FHTML.Clear;
FHTML.LoadFromStream(FHTTPS.Document, TEncoding.UTF8);
if pos('<steamID64>', FHTML.Text) > 0 then
begin
FRegExp.Expression := '<steamID64>(.*?)</steamID64>';
if FRegExp.Exec(FHTML.Text) then
repeat
FLIST.Add(FRegExp.Match[1]);
until not FRegExp.ExecNext;
end;
end;
end;
finally
FreeAndNil(FHTTPS);
FreeAndNil(FLIST);
FreeAndNil(FHTML);
FreeAndNil(FRegExp);
end;
end;Проблема: Дело в том , что эти 5 потоков выполняют одно и тоже действие. Вопрос: Как сделать так , чтобы действия не повторялись а улучшилась скорость? То есть , если всё делать в один поток , работа будет медленной , я специально сделал многопоток чтобы улучшить скорость , вообщем создаётся 5 потоков но действие повторяется , мне нужно чтобы эти 5 потоков выполняли одно действие только быстро , то есть как один поток , но при этом скорость была больше. Вот весь код: Код:
type
Searcher = class(TThread)
private
FHTTPS: THTTPSend;
FLIST, FHTML: TStringList;
FRegExp: TRegExpr;
protected
procedure Execute; override;
procedure setheaders;
public
end;
var
Form1: TForm1;
URL: string;
Th: array [0 .. 5] of TThread;
implementation
{$R *.dfm}
{ Searcher }
procedure Searcher.Execute;
var
i: integer;
begin
FHTTPS := THTTPSend.Create;
FLIST := TStringList.Create;
FHTML := TStringList.Create;
FRegExp := TRegExpr.Create;
try
for i := 0 to 5 do
begin
setheaders;
FHTTPS.HTTPMethod('GET', URL + inttostr(i));
begin
FHTML.Clear;
FHTML.LoadFromStream(FHTTPS.Document, TEncoding.UTF8);
if pos('<steamID64>', FHTML.Text) > 0 then
begin
FRegExp.Expression := '<steamID64>(.*?)</steamID64>';
if FRegExp.Exec(FHTML.Text) then
repeat
FLIST.Add(FRegExp.Match[1]);
until not FRegExp.ExecNext;
end;
end;
end;
finally
FreeAndNil(FHTTPS);
FreeAndNil(FLIST);
FreeAndNil(FHTML);
FreeAndNil(FRegExp);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Threads: integer;
begin
URL := Edit1.Text + '/memberslistxml/?xml=1&p=';
for Threads := 0 to 4 do
begin
Th[Threads] := Searcher.Create;
Th[Threads].FreeOnTerminate := true;
end;
end;
procedure Searcher.setheaders;
begin
with FHTTPS do
begin
Document.Clear;
Headers.Clear;
KeepAlive := true;
Headers.Add('Accept: */*');
Headers.Add('Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4');
Headers.Add('Accept-Charset: utf-8;q=0.7,*;q=0.3');
UserAgent :=
'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36';
end;
end;Последний раз редактировалось Avenger15, 30.09.2015 в 22:30. |
|
#2
|
|||
|
|||
|
Кажется, вы чего-то не понимаете в потоках. Точнее в их применении.
Фактически, можно говорить о том, что поток - это отдельный процесс. Просто они выполняются в одном адресном пространстве, так что легче организовать взаимодействие между ними. Однако, они остаются все-таки разными процессами. Т.е. если потоку, например, нужно работать с COM, то каждый поток должен инициализировать COM-подсистему. В вашем конкреном случае я вижу только одну возможность (признаюсь, смотрел не очень внимательно). Вот там, где у вас есть цикл от 1 до 5, каждый поток делает совсем одно и то же. Можно сделать так, что бы каждый поток отрабатывал только одну из цифр (т.е. разные урлы). Тогда каждый поток будет выполнять свою задачу, не пересекаясь по данным c другими. Что будет примерно в 5 раз быстрее (ну не в 5 на самом деле, где-то, ориентировочно, в 3, и то, если сама операция достаточно длительная). |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Avenger15 (01.10.2015)
| ||
|
#3
|
|||
|
|||
|
Цитата:
Цитата:
Последний раз редактировалось Avenger15, 01.10.2015 в 00:13. |
|
#4
|
|||
|
|||
|
1) перенести переменную i из метода Execute в поля класса Searcher.
2) из метода Execute убрать цикл. 3) Button1Click переписать так Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Threads: integer;
begin
URL := Edit1.Text + '/memberslistxml/?xml=1&p=';
for Threads := 0 to 4 do
begin
Th[Threads] := Searcher.Create(True);
Th[Threads].i := Threads;
Th[Threads].FreeOnTerminate := true;
Th[Threads].Resume();
end;
end; |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Avenger15 (01.10.2015)
| ||
|
#5
|
|||
|
|||
|
Цитата:
Код:
type
Searcher = class(TThread)
private
FHTTPS: THTTPSend;
FLIST, FHTML: TStringList;
FRegExp: TRegExpr;
protected
procedure Execute; override;
procedure sync;
procedure setheaders;
public
i: integer;
end;
var
Form1: TForm1;
URL: string;
Th: array [0 .. 5] of TThread;
implementation
{$R *.dfm}
{ Searcher }
procedure Searcher.Execute;
begin
FHTTPS := THTTPSend.Create;
FLIST := TStringList.Create;
FHTML := TStringList.Create;
FRegExp := TRegExpr.Create;
try
setheaders;
FHTTPS.HTTPMethod('GET', URL + inttostr(i));
begin
FHTML.Clear;
FHTML.LoadFromStream(FHTTPS.Document, TEncoding.UTF8);
if pos('<steamID64>', FHTML.Text) > 0 then
begin
FRegExp.Expression := '<steamID64>(.*?)</steamID64>';
if FRegExp.Exec(FHTML.Text) then
repeat
Synchronize(sync);
until not FRegExp.ExecNext;
end;
end;
finally
FreeAndNil(FHTTPS);
FreeAndNil(FLIST);
FreeAndNil(FHTML);
FreeAndNil(FRegExp);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Threads: integer;
begin
URL := Edit1.Text + '/memberslistxml/?xml=1&p=';
for Threads := 0 to 4 do
begin
Th[Threads] := Searcher.Create(True);
Th[Threads].i := Threads;
Th[Threads].FreeOnTerminate := True;
Th[Threads].Resume();
end;
end;При компиляции ошибка: Код:
[dcc32 Error] Project.pas(98): E2003 Undeclared identifier: 'i' |
|
#6
|
||||
|
||||
|
У тебя
Код:
Th: array [0 .. 5] of TThread; |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Avenger15 (01.10.2015)
| ||