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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2012, 08:44   #1
garyanikin
Дизайнер, Кодер.
Пользователь
 
Аватар для garyanikin
 
Регистрация: 31.12.2009
Сообщений: 45
По умолчанию Многопоточность

Здравствуйте. Скорее всего этот вопрос поднимался на форуме тысячи раз, но я не смог найти решения...

Есть код, который парсит странички сайта(кстати, возможно ли загружать не всю страничку целиком, а лишь до опр. текста?):
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
page,name:string;
i,count:integer;
f,it:textfile;
begin
Button3.Enabled:=true;
 while button3.Enabled do begin
//Генерация переменной name
 page:='';
 page:=idhttp1.Get('http://sitename.ru/profile/'+name);
 if pos('/profile/'+name+'"',page)<>0 then begin
 Memo2.Lines.Add(name);
 end;
end;
Прошу помощи в реализации оного в многопоточном режиме.

Как сделал я, работает совсем не так быстро как я ожидал(код работает плохо, прирост не большой, т.е. 10 потоков работают в два-три раза быстрее чем однопоточный, 50-80-100 потоков работают так же как 10):
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
Work:=true;
 for Thread:=1  to strtoint(Edit1.Text) do
  TNewThread.Create(false);
 Thread:=strtoint(Edit1.Text);
end;

procedure TNewThread.Execute;
var
    HTTP: TIdHTTP;
    page:string;
begin
 while Work do
  begin
//тут идет генерация переменной name
     HTTP:=TIdHTTP.create;
     HTTP.HandleRedirects:=true;
     try
      page:='';
      page:=HTTP.Get('http://sitename.ru/profile/'+name);
      if pos('/profile/'+name+'"',page)<>0 then
       Rez:=1
      else
       Rez:=0;
     finally
     HTTP.Free;
     Synchronize(Sync);
    end;
  end;
end;

procedure TNewThread.Sync;
begin
 case Rez of
   1:begin
      Append(f);
      Writeln(f,name);
      Closefile(f);
      Form1.Memo1.Lines.Add(name);
 end;
end;
Кстати иногда этот код просто останавливается, проверит несколько name и все, без выдачи ошибок и т.д., просто останавливается и все.
P.S. Понял почему прога останавливается. Иногда вылетает ошибка 'Socket Error # 10060 Connection timed out.'. И поток останавливается, как исправить?

UPD. Если перевести с Indy на Synapse программа будет работать шустрее?
UPD.2 Сильно ли замедляет работу программы вывод данных в Label? И Refresh этого Lable'а?

Заранее спасибо.

Последний раз редактировалось garyanikin; 16.11.2012 в 09:32.
garyanikin вне форума Ответить с цитированием
Старый 16.11.2012, 09:55   #2
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Цитата:
Сообщение от garyanikin Посмотреть сообщение
кстати, возможно ли загружать не всю страничку целиком, а лишь до опр. текста?
До определенного текста не получится, только лишь побайтово - частичное скачивание web-странички с помощью Synapse

Цитата:
Сообщение от garyanikin Посмотреть сообщение
Как сделал я, работает совсем не так быстро как я ожидал(код работает плохо, прирост не большой, т.е. 10 потоков работают в два-три раза быстрее чем однопоточный, 50-80-100 потоков работают так же как 10)
От огромного числа потоков производительности нет. Лично я использую 3-7 потоков (оптимально)

Цитата:
Сообщение от garyanikin Посмотреть сообщение
UPD. Если перевести с Indy на Synapse программа будет работать шустрее?
Друг, лучше переходи на Synapse. Отличная библиотека. Если сайт поддерживает gzip, то прирост будет более 75% (трафик)

Я раньше писал один парсер, который собирает ссылки и с этих же ссылок парсит значения, если надо, покажу исходник

Последний раз редактировалось Lardes; 16.11.2012 в 09:59.
Lardes вне форума Ответить с цитированием
Старый 16.11.2012, 10:28   #3
garyanikin
Дизайнер, Кодер.
Пользователь
 
Аватар для garyanikin
 
Регистрация: 31.12.2009
Сообщений: 45
По умолчанию

Цитата:
Сообщение от Lardes Посмотреть сообщение
До определенного текста не получится, только лишь побайтово - частичное скачивание web-странички с помощью Synapse
Мне впринципе достаточно получить Title странички и все)
Цитата:
Сообщение от Lardes Посмотреть сообщение
Я раньше писал один парсер, который собирает ссылки и с этих же ссылок парсит значения, если надо, покажу исходник
Буду премного благодарен^^
Цитата:
Друг, лучше переходи на Synapse. Отличная библиотека. Если сайт поддерживает gzip, то прирост будет более 75% (трафик)
Печально что все переписывать придется ахахахха
garyanikin вне форума Ответить с цитированием
Старый 16.11.2012, 10:58   #4
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Если возникнут вопросы, пиши
Вложения
Тип файла: rar Cyanide Burn Parser D2007.rar (68.8 Кб, 55 просмотров)
Lardes вне форума Ответить с цитированием
Старый 16.11.2012, 11:18   #5
garyanikin
Дизайнер, Кодер.
Пользователь
 
Аватар для garyanikin
 
Регистрация: 31.12.2009
Сообщений: 45
По умолчанию

Спасибо пойду копаться)
garyanikin вне форума Ответить с цитированием
Старый 16.11.2012, 14:24   #6
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию

вот все по потоку прочти и забудь про проблему потоков !
<<<ССЫЛКА>>>
fucil вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ многопоточность kineziz Общие вопросы C/C++ 3 11.09.2012 13:20
многопоточность Freddi Krjuger Общие вопросы по Java, Java SE, Kotlin 1 15.05.2011 23:46
Многопоточность WennY Общие вопросы Delphi 11 23.04.2011 00:46
Многопоточность boo_mago Общие вопросы C/C++ 7 21.03.2011 21:23
Многопоточность Dezmont_ Общие вопросы .NET 1 06.11.2010 18:34