Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > idHttp.get в несколько потоков


Автор: Mach3 10.12.2010, 07:57
Привет!
Имеется функция, парсирующая ( надеюсь, правильно выразился ) странички..
Страничек таких много и загружаются они, на данный момент в цикле последовательно..
Как реализовать одновременную загрузку нескольких страничек ( думаю, это должно ускорить работу программы)?
Насколько я понимаю, необходимо использовать нити..
Но с Threads никогда не сталкивался, и не особо понимаю как это должно все выглядеть.
Если не затруднит, не могли бы вы вкратце объяснить работу такого алгоритма?
Спасибо..

Автор: Mach3 10.12.2010, 09:28
Статья http://forum.vingrad.ru/forum/topic-60076.html убила множество вопросов..
Спасибо..

Автор: Mach3 10.12.2010, 11:28
запускаю потоки:
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  Threads: array of TGetFpost;
  i: Byte;
begin
  SetLength(Threads, 10);

  for i := 0 to 9 do
   if posex('http://',Links[i],0)>0 then begin

    Threads[i] := TGetFpost.Create(True);
    Threads[i].TLink:=Links[i];
    Threads[i].FreeOnTerminate := True;
    Threads[i].Resume;

  end;

В таком виде все работает..
Проблема в том, что у меня в Links около 1000 ссылок..
Как сделать, чтобы "высвободившийся" поток запустить для нового линка?

Автор: Snowy 10.12.2010, 14:14
1. Заведи глобальную переменную integer, в которой будет храниться номер поcледней запрошенной ссылки из Links
2. Создай и запусти нужное количество тредов.
3. В треде крути цикл, такого типа:
Код
repeat
  i := InterlockedIncrement(переменная_из_п1);
  if i >= 1000 then break;
  TLink:=Links[i];
  тут грузим ссылку
until false;

InterlockedIncrement - атомарная функция, будет всегда возвращать следующий номер.
Каждый тред, вызывая её, будет автоматом увеличивать переменную на еденицу.
Функция атомарная, а потому потокобезопасная.

Автор: Mach3 12.12.2010, 06:43
А каким методом лучше пользоваться?
использовать атомарную функцию или использовать критическую секцию?
спасибо..

Автор: Snowy 13.12.2010, 13:35
Для увеличения счётчика лучше атомарная функция - ведь всё, что нужно - прибавить еденичку.
Interlocked функции для этого и предназначены.

Автор: Mach3 5.1.2011, 06:53
Хотел бы уточнить..
Допустим, мне необходимо в глоб переменную типа TStringList добавлять строки из разных потоков..
Обязательно ли Links.Add(Link) вызывать в критической секции?
Спасибо..

Автор: Snowy 5.1.2011, 16:22
Обязательно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)