Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> idHttp.get в несколько потоков 
:(
    Опции темы
Mach3
Дата 10.12.2010, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: 3
Всего: 2



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

--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
Mach3
Дата 10.12.2010, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: 3
Всего: 2



Статья Threads убила множество вопросов..
Спасибо..
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
Mach3
Дата 10.12.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: 3
Всего: 2



запускаю потоки:
Код

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 ссылок..
Как сделать, чтобы "высвободившийся" поток запустить для нового линка?
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
Snowy
Дата 10.12.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

InterlockedIncrement - атомарная функция, будет всегда возвращать следующий номер.
Каждый тред, вызывая её, будет автоматом увеличивать переменную на еденицу.
Функция атомарная, а потому потокобезопасная.
PM MAIL   Вверх
Mach3
Дата 12.12.2010, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: 3
Всего: 2



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

Это сообщение отредактировал(а) Mach3 - 12.12.2010, 10:24
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
Snowy
Дата 13.12.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Для увеличения счётчика лучше атомарная функция - ведь всё, что нужно - прибавить еденичку.
Interlocked функции для этого и предназначены.
PM MAIL   Вверх
Mach3
Дата 5.1.2011, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 26.11.2005

Репутация: 3
Всего: 2



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

Это сообщение отредактировал(а) Mach3 - 5.1.2011, 06:54
--------------------
Век живи - век учись...
PM MAIL ICQ   Вверх
Snowy
Дата 5.1.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Обязательно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.