Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Распараллеливание потока


Автор: AlexeyShestchenko 23.4.2008, 19:26
Всем здрасти.
У меня тут такое дело..вообщем думаю на программу нацепить потоки, т.к. в ней присутствует скачка страниц из интернета.
Задача такая, у друга есть хостинг (~1000 сайтов).
Имеются ссылки на все страницы этих сайтов, понятно откуда smile

Друг попросил чтобы я написал прогу, которая будет проверять наличие определенных keyword на страницах этих сайтов.
Причем сделать все это нужно было под win!!!(как просто это делается в unix обсуждать не будем, а то ща полетят советы ;))). все сделал, работает, Но последовательно, береться одна ссылка, потом вторая и т.д.
Но вот подумал что если сделать все это дело через потоки то оно быстрее будет, при распараллеливании.
Вижу следующим образом, если не верно то поправьте, опыт работы с потоками >> 0 :
создаю поток - МОНИТОР, еоторый будет мониторить кол-во запущенных потоков и их состояния.
ну и сам поток который будет скачивать страницу и проверять keywords'ы и в зависимости от их нахождения добавлять инфу на форму.
В ту сторону думаю или нет?
Если мыслю правильно, то следующий вопрос, сколько надо загружить одновременно потоков для загрузки страниц?

Петровича читал.
Жду ваших комментариев и советов на мою тему.

Автор: dumb 23.4.2008, 20:53
может таки ограничиться поиском по файлам локально, раз уж друг - хостер?

Автор: AlexeyShestchenko 23.4.2008, 22:28
я ж написал что надо под вынь, это делается на заказ для группы людей,кто им даст доступ к серваку.)))

можно конечно ограничиться тем что есть, но я уверен просто что с использованием потоков работать будет быстрее. Прошу помощи!

Автор: dumb 24.4.2008, 11:32
Цитата(AlexeyShestchenko @  23.4.2008,  20:26 Найти цитируемый пост)
создаю поток - МОНИТОР, еоторый будет мониторить кол-во запущенных потоков и их состояния.
мониторить можно и из основного потока.

Цитата(AlexeyShestchenko @  23.4.2008,  20:26 Найти цитируемый пост)
сколько надо загружить одновременно потоков для загрузки страниц?
запускай потоки не все сразу, а через промежутки по 100-1000 мс(примерно), и поставь ограничение на их число что-нибудь около 64. хотя по хорошему, всякие задержки и количество надо считать в зависимости от времени выполнения этих потоков.

Автор: AlexeyShestchenko 24.4.2008, 14:57
мониторить из основного потока - это имеется ввиду таймером?
а если мне надо еще к тому мониторить появление новых данных на проверку, как тогда быть?

почему нужно делать временные промежутки между запусками потоков?
я примерно сделал похожую конструкцию.
т.е. есть поток монитор, на форме есть переменная count_theards; которая отвечает за кол-во запущенных потоков. монитор запускает 50 потоков, и када какой нить поток завершают свою работу то монитор запускает новый поток и так все.
вроде ничего, но столкнулся с проблемой что иногда потоки завершают свою работу так и не выдав мне данные, хотя они есть!
значит происходит какой-то сбой...чтоли...пока не пойму в чем дело.

Автор: dumb 25.4.2008, 00:49
Цитата(AlexeyShestchenko @  24.4.2008,  15:57 Найти цитируемый пост)
почему нужно делать временные промежутки между запусками потоков?
оно не "нужно", а "лучше". запуск потока - сравнительно тяжелая операция. а потом эти потоки у тебя "наперебой"(в смысле почти одновременно) начинают соединяться...

Цитата(AlexeyShestchenko @  24.4.2008,  15:57 Найти цитируемый пост)
столкнулся с проблемой что иногда потоки завершают свою работу так и не выдав мне данные, хотя они есть!
это просто ошибки. smile

Автор: AlexeyShestchenko 25.4.2008, 02:00
какие ошибки?
поиск приметивен
posex

Автор: dumb 25.4.2008, 02:15
Цитата(AlexeyShestchenko @  25.4.2008,  03:00 Найти цитируемый пост)
какие ошибки?
http://forum.vingrad.ru/act-Help/CODE-01/HID-17.html

скорее всего при передаче результата работы из потока.

Автор: AlexeyShestchenko 25.4.2008, 10:29
Код

procedure TKey.start;
begin
  if Form1.ListBox2.Items.count > 0 then
  begin
    S := form1.ListBox2.Items.Strings[0];
    form1.ListBox2.Items.Delete(0);
  end;
end;

procedure TKey.Execute;
var
  list: string;
begin
  Synchronize(start);
  list := get('get', S);
  if Posex(keys, list, 1) <> 0 then
    Synchronize(update);
end;

procedure TKey.update;
begin
  form1.ListBox3.Items.Add(s);
end;

Автор: AlexeyShestchenko 26.4.2008, 00:03
неужели нечем помочь, коллеги?

Автор: MetalFan 26.4.2008, 18:38
и что, ты ждешь телепатов, чтоб тебе что-то сказали по твоему "огрызку" кода?
что за Get? что за S, key, list?

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