![]() |
|
|
Регистрация | << Правила форума >> | 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; jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Avenger15 (01.10.2015)
|