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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2011, 18:12   #1
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию Многопоточность в GET запросе

Здравствуйте! Недавно начал задумываться, а что же такое многопоточность и как ее реализовать при получении страниц. Искал в инете инфу, так и ничего не понял. Поэтому прошу помощи у вас специалисты Например, я хочу реализовать процедуру получения страниц методом GET. Есть поток:

Код:
  TGo = class(TThread)
  private
  protected
    procedure Execute; override;
  end;
Его вызов:

Код:
procedure TBox.ButtonClick(Sender: TObject);
begin
  Go := TGo.Create(True);
  Go.FreeOnTerminate := True;
  Go.Priority := TPNormal;
  Go.Resume;
end;
И собственно сам код который будет получать страницы

Код:
procedure TGo.Execute;
var
  I: Integer;
begin
  for I := 1 to 10 do
      S := Box.HTTP.Get(URL);
end;
То есть, предположим, получаю я 10 разных страниц. Но как я понимаю, они получаются в одном потоке, а как же реализовать здесь многопоточность? Например в 10 потоков...
RIO вне форума Ответить с цитированием
Старый 28.04.2011, 18:30   #2
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

есть такая вещь, счётчик потоков завётся
bulldog5293 вне форума Ответить с цитированием
Старый 28.04.2011, 18:34   #3
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Как это реализовать? Напишите пожалуйста пример на база моего кода, буду очень благодарен
RIO вне форума Ответить с цитированием
Старый 28.04.2011, 21:26   #4
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Код:
То есть, предположим, получаю я 10 разных страниц. Но как я понимаю, они получаются в одном потоке, а как же реализовать здесь многопоточность? Например в 10 потоков...
Советую в решение этой проблемы не заморачиваться с многопоточностью, т.к. по мимо всего, тебе нужно будет решить куда страницы скидывать и заблочить это всё в критическую секцию, которую я так и не понял.
bulldog5293 вне форума Ответить с цитированием
Старый 28.04.2011, 21:30   #5
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Я вроде уже понял как это работает. Но вот возникла одна проблема, как узнать или все потоки завершили свою работу? Вернее сказать, как подождать пока все потоки завершат свою работу, и вывести соответствующее сообщение?
RIO вне форума Ответить с цитированием
Старый 29.04.2011, 16:50   #6
Mifody
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 215
По умолчанию

код написанный на коленке, к примеру - парсим страницы, и добавляем результат в Memo1

Код:

  TGo = class(TThread)
    // список переменных для хранения данных
    data1 : string
    data2 : string
    data3 : string
    data4 : string
  private
  protected
    procedure Update;
    procedure Execute; override;
  public
    URL : string // сюда запишем урл, с которого будем данные дергать
  end;

procedure TGo.Execute;
var
 HTTP : TIdHTTP;
  s : String;
begin
  HTTP := TIdHttp.Create(nil);
  S := HTTP.Get(URL);
// дальше измеваемяся над переменной S, извлекаем из нее нужные данные и записываем в переменные data1, data2, data3, data4 
Synchronizi(Update);
HTTP.Free;
end;

procedure TGo.Update;
begin
  Form1.Memo1.Lines.Add(data1 + '--' +data2 + '--' data3 + '--' data4);
end;

// вызов потоков, а именно запускаем 10 потоков практически одновременно
procedure TBox.ButtonClick(Sender: TObject);
var
i : Integer;
assURL : array of string;
begin
for i := 0 to 10 do
begin
  with TGo.Create(True) do
  begin
    URL := arrURL[i];
    FreeOnTerminate := True;
    Priority := TPNormal;
    Resume;
  end;
end
end;
насчет "подождать когда все потоки завершаться"
1. завести счетчик типа integer когда создаем поток +1, когда отработал -1. Проверяем счетчик, если он равен 0 то все Ок (тут прийдется заморачиваться с синхронизацией либо критическими секциями)
2. использовать TThreadList - хранилище потоков, тогда придется написать метод удаления потока по завершению, но у этого списка есть методы безопасной работы как с самими потоками, так и с определением количества

У меня в примере довольно "нехорошее" использование создания потоков. Я их без переменных создаю, так что утечка памяти может появиться
Помог с вопросом - тыркаем в весы, Вам не сложно, а мне приятно

Последний раз редактировалось Mifody; 29.04.2011 в 16:55.
Mifody вне форума Ответить с цитированием
Старый 29.04.2011, 23:15   #7
Usov
Форумчанин
 
Аватар для Usov
 
Регистрация: 29.09.2009
Сообщений: 228
По умолчанию

http://symmetrica.net/Delphi/threads.htm
http://grj.ru/archives/71
http://forum.vingrad.ru/topic-60076.html
http://edn.embarcadero.com/article/22411
Usov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность WennY Общие вопросы Delphi 11 23.04.2011 00:46
Многопоточность и с++ Koshmarovsky Visual C++ 13 06.09.2010 20:39
многопоточность DeDoK Общие вопросы Delphi 6 01.08.2010 02:14
Многопоточность kroŧ Общие вопросы Delphi 5 21.06.2010 10:47
Многопоточность PUH Помощь студентам 3 06.06.2009 13:54