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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2015, 12:57   #11
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

ну попробуй.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.04.2015, 14:11   #12
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

min@y™Хорошая книга, много полезных примеров,
Поиск файлов в потоке
Потоки и базы данных
Многопоточная графика и тд.
Это все реализовать не так сложно по сравнению с парсингом в интернете в многопотоках

=================================== =============

Но сейчас пока интересует вот это:
Реально отработал вот этот у ДралсяСошибками пример типа того что мы для каждого потока создаем свой TIdHttp!

А что бы создать для каждого свой полагаю лучшего способа как сварганить из потоков и объектов TIdHttp массив лучшего способа не придумать.

Все работает значит по такому принципу:
Создаем циклом 10 потоков
Создаем циклом 10 объктов TIdHttp
Загружаем в каждый TIdHttp[i] страницу сайта

При чем загрузку начинаем одновременно во все TIdHttp[i]!!!

Внутри этой процедуры ни каких циклов! Иначе ни какой многопоточности неощущается, там только инкримент!
Код:
procedure TMyThread.Execute
  begin
    inc(s);
    //Form1.Memo1.Lines.Add(Http[s].Get('http://www.yandex.ru/'));
    Form1.Memo1.Text := Http[s].Get('http://www.yandex.ru/');
    Http[s].Free;
  end;
И так подведем итог:
Много-поток приведенным здесь способом отработает очень быстро, он быстро загрузит 10 страниц без проблем.

Но проблемы возникают тогда когда я хочу загрузить 100, 500 или 1000 страниц.
Этот способ делать массив потоков = 1000 штук и массив IdHttp-шек уже неподходит! Все начинает зависать!
А использовать одну Http[i]-шку я безопасно могу использовать только один раз, ведь я не знаю когда она освободится от загрузки страницы и ее можно применить будет снова.
Если я неправильно сказал в этом месте то поправьте приведите пример кодом.

Какие способы еще решения данной проблемы можно воплотить в реальность?
Например 5 потоков но чтоб они работали постоянно, можно кодом пример.

Последний раз редактировалось NIKOLAYY2; 06.04.2015 в 14:22.
NIKOLAYY2 вне форума Ответить с цитированием
Старый 06.04.2015, 14:34   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Все начинает зависать!
Тырнет слабенький )
Я так понимаю ты с запрос на один и тот же сайт даешь? Серверу тамошнему это может не нравиться (мне бы не понравилось), и он будет блокировать твои запросы считая что ты бот, да еще и нагло атакующий его количеством.

Что я хочу сказать:
1) Не делай так много запросов сразу. Ставь в очередь.
2) Твой пример не идеален. Предлагаю замену:
Код:
procedure TMyThread.Execute
  begin
    With TIdHTTP.Create(nil) do 
     Form1.Memo1.Text := Get('http://www.yandex.ru/');
     Free;
    end;
  end;
Опять таки обращение к Form1.Memo1 лучше конечно синхронизировать, иначе такая каша может получиться - мама не горюй. Т.е.:
Код:
procedure TMyThread.Execute
  begin
    With TIdHTTP.Create(nil) do 
     try
       Res := Get('http://www.yandex.ru/');
       Synchronize(procedure
  begin
     Form1.Memo1.Append(Res);
  end);
     except
     end;
     Free;
    end;
  end;
Res - свойство класса TMyThread.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2015, 15:31   #14
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Все работает значит по такому принципу:
Создаем циклом 10 потоков
Создаем циклом 10 объктов TIdHttp
Загружаем в каждый TIdHttp[i] страницу сайта
[длинная_108-этажная_грязная_матерная_фраза]НИКОГДА ТАК НЕ ДЕЛАЙ!!! ИНАЧЕ Я ТЕБЯ НАЙДУ И ЛИЦО ОТКУШУ!!![/длинная_108-этажная_грязная_матерная_фраза]
Используй TThreadList и потомок TStream с полем TidHTTP и соотв. свойством!!!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.04.2015, 20:13   #15
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

Цитата:
min@y™
Используй TThreadList и потомок TStream с полем TidHTTP и соотв. свойством!!!
Да я бы рад, но не умею...

Цитата:
Stilet
Тырнет слабенький )
Да не интернет нормальный у меня. В смысле Res сделать типом string внутри класса?

Там еще опечатка у вас Synchronize(procedure
я ее поправил и в конечном итоге получил такой код:

Он компилируется, но при нажатии кнопки зависает все.
Я наверно неверно снова сделал что-тоне так..

Код:
  TMyThread = class(TThread)
  private
    { Private declarations }
  protected
    Res: string; //добавил сюда
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  Thread: TMyThread;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
begin
  with TIdHTTP.Create(nil) do
    try
      Res := Get('http://www.yandex.ru/');
      Synchronize(Execute);
      begin
        Form1.Memo1.Lines.Add(Res);
      end;
    except
    end;
  Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Thread := TMyThread.Create(False);
  Thread.Priority := tpNormal;
end;

end.
NIKOLAYY2 вне форума Ответить с цитированием
Старый 06.04.2015, 20:29   #16
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

у тебя бесконечная рекурсия в теле треда.
Цитата:
Код:
procedure TMyThread.Execute;
begin
  with TIdHTTP.Create(nil) do
    try
      Res := Get('http://www.yandex.ru/');
      Synchronize(Execute); // рекурсивный вызов Synchronize()
      begin
        Form1.Memo1.Lines.Add(Res);  // <--- эт чо?
      end;
    except
    end;
  Free;
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.04.2015, 20:47   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Там еще опечатка у вас Synchronize(procedure
Это не опечатка, а анонимная функция )
У тебя какой версии Делфи то?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2015, 20:56   #18
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

Цитата:
min@y™
Form1.Memo1.Lines.Add(Res); // <--- эт чо?
Незнаю я. Это я код выше пытался поправить чтобон хотя бы скомпилировался..

==================================
Ну а возьмем мы такой например алгоритм:

Делаем 5 потоков, запускаем их параллельно разом!
Все потоки стартуют одновременно, идет загрузка 5 страниц сразу!

Затем (делаем какую то паузу) ждем когда доработает последний поток
и запускаем 5 потоков снова!

Нормальный алгоритм? И программа вроде как зависнуть не должна с пяти потоков и скрость увеличится в пять раз верно?

Цитата:
Stilet
Это не опечатка, а анонимная функция )
Я в Delphi 7 код запускал, но есть еще Delphi 2010.

Последний раз редактировалось NIKOLAYY2; 06.04.2015 в 20:58.
NIKOLAYY2 вне форума Ответить с цитированием
Старый 06.04.2015, 21:29   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в Delphi 7
Сделай еще один метод-процедуру без параметров для класса потока.
И в нее помести
Код:
Form1.Memo1.Lines.Add(Res);
Тогда можешь писать Synchronize(<Тут имя этого метода>);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2015, 21:30   #20
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

продолжайте читать про потоки, потом переходите к понятию пула потоков, и тогда ждет вас удача, а пока как идеи так и код - в топку
lomastr_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив потоков. Не приходит Terminate grb Общие вопросы Delphi 4 26.01.2015 10:19
Многократное использование потоков(пул потоков) ProgrammistRT Общие вопросы Delphi 10 06.04.2014 13:42
Массив потоков, и как они очищаются Winexcel Общие вопросы Delphi 5 09.10.2013 16:43
Синхронизация потоков Fireblade-fan Общие вопросы Delphi 5 17.12.2012 01:57
Не дать накапливаться N кол-ву потоков в критической секции. Массив. HSR Общие вопросы Delphi 7 15.11.2012 01:02