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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2012, 07:24   #1
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию Потоки, как ограничить количество?

Приветствую всех.
Начинаю работать с потоками.
У меня есть список урлов (url), 25 000.
По каждому из них надо пройтись и пропарсить.
Список загружаю в ListBox.
В моем коде получается так что количество поток = количеству ссылок в ListBox
Код:
procedure TForm2.Button1Click(Sender: TObject);
begin
 for I := 0 to ListBox1.Items.Count -1 do
   begin
   with TMyThread.Create(True) do
  begin
    URL := ListBox1.Items[i];
    FreeOnTerminate := True;
    Priority := TPNormal;
    Resume;
  end;

end;
Как сделать так что бы количество поток задавалось пользователем?




Вот код всей программы

Код:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdCookieManager;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  type
      TMyThread = class(TThread)

      private
       FResultString: TStringList;
        { Private declarations }
      protected
        procedure Execute; override;
        procedure Update;
      public
      { Public declarations }
       URL : string;
      end;


var
  Form2: TForm2;
  MyThread: TMyThread;
   I : Integer;


implementation

{$R *.dfm}
//Процедура выдергивания строки между двумя заданными строками.........//
Procedure IsolateText( Const S: String; Tag1, Tag2: String; list: TStrings );
var pScan, pEnd, pTag1, pTag2: PChar; foundText: String;searchtext: String;
begin
  searchtext := Uppercase(S);
   Tag1:= Uppercase( Tag1 );
    Tag2:= Uppercase( Tag2 );
     pTag1:= PChar(Tag1);
      pTag2:= PChar(Tag2);
      pScan:= PChar(searchtext);
  repeat
  pScan:= StrPos( pScan, pTag1 );
    if pScan <> Nil then
      begin
       Inc(pScan, Length( Tag1 ));
        pEnd := StrPos( pScan, pTag2 );
        If pEnd <> Nil then
           begin
            SetString( foundText,
            Pchar(S) + (pScan- PChar(searchtext) ),
            pEnd - pScan );
            list.Add( foundText );
            pScan := pEnd + Length(tag2);
           end
       else
      pScan := Nil;
    end;
  Until pScan = Nil;
end;

procedure  TMyThread.Update ;
begin
 Form2.Memo1.Lines.AddStrings(FResultString);
end;

//....................................................
procedure TMyThread.Execute;
var IdHttp1: TIdHTTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    CookieManager1: TIDCookieManager;
    
    s:string;
begin


 IdSSLIOHandlerSocketOpenSSL1:=TIdSSLIOHandlerSocketOpenSSL.Create;
 CookieManager1:=TIDCookieManager.Create;
 IdHttp1:=TIdHTTP.Create;
 IdHttp1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
 IdHttp1.CookieManager:=CookieManager1;
 IdHttp1.HandleRedirects:=true;

 S:= IdHttp1.Get(URL);
 FResultString:=TStringList.Create;
 IsolateText(s,'<a class="b-serp-item__title-link" href="','" onmousedown="rc',FResultString);
 Synchronize(Update);
 IdHttp1.Free;
 CookieManager1.Free;

end;


//......................................................
procedure TForm2.Button1Click(Sender: TObject);
begin
 for I := 0 to ListBox1.Items.Count -1 do
   begin
   with TMyThread.Create(True) do
  begin
    URL := ListBox1.Items[i];
    FreeOnTerminate := True;
    Priority := TPNormal;
    Resume;
  end;

end;


end;
//...............................................................


end.
bakanaev вне форума Ответить с цитированием
Старый 16.08.2012, 08:44   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну а кто вам мешает создать 10 потоков и ждать пока он закончит, потом дать новое задание?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2012, 16:55   #3
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну а кто вам мешает создать 10 потоков и ждать пока он закончит, потом дать новое задание?
Либо запускать каждый раз новый поток.
Kix.IV вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничить количество запуска программы Tuman777 Общие вопросы Delphi 12 15.10.2011 20:27
как ограничить количество вводимых чисел пользователем? Kati Помощь студентам 4 21.10.2010 11:56
Ограничить количество клиентов SwiP Работа с сетью в Delphi 1 16.06.2010 19:17
Как ограничить количество вводимых знаков числа после запятой. proggramer Общие вопросы C/C++ 1 24.03.2010 03:15
Как ограничить ввод? alsq Общие вопросы Delphi 8 24.03.2007 14:30