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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточность 
:(
    Опции темы
NieL
Дата 20.3.2011, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



есть массив идентификаторов целочисленного типа:

Код

IDs: array [1..99] of Integer;


Задача: пройти по массиву, подставляя текущий идентификатор в GET-запрос. Сделать возможность отправки GET-запросов в несколько потоков. Собственно вопрос по многопоточности, как такое обычно правильно делается? Нашел два варианта реализация.

1-й вариант
 
Код

threads_for_run := 5; // количество потоков, будет вводится пользователем, для примера 5 
for I := Low(IDs) to High(IDs) do
begin
  Application.ProcessMessages;
  if thread_running = thread_for_run then  // thread_running - глобальная переменная, количество работающих в данный момент потоков
    while thread_runnin = thread_for_run do
    begin
      Sleep(10);
      Application.ProcessMessages; 
    end;
   TMyThread.Create(False, IDs[I]); // нужна ли тут critical section?

end;


2-вариант

Создаем нужное количество потоков.

Код

for I := 1 to threads_for_run do
begin
  TMyThread.Create(False);  
  
end;


проходим по элементам массивава из TMyThread.Execute;

Код

procedure TMeThread.Execute;
var
  ID: Integer;
begin
  while True do // пока не конец массива
  begin
    CriticalSection.Enter; // нужна ли тут critical section?
    try 
      Inc(cur_id); // глобальная переменная, текущий элемент массива
  
      if cur_id < High(IDs) then   
        ID := cur_id
   
      else
        // Break;
    finally
      CriticalSection.Leave;
    end;
    // формируем Get-запрос, отправляем на веб сервер    

   end;

end;

PM MAIL   Вверх
MetalFan
Дата 20.3.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Как по мне, так оба варианта... не фонтан.
Имхо, должен быть один поток-менеджер, и N рабочих потоков.
У менеджера должен быть некий пул запросов и событие окончания обработки запроса.
Менеджер периодически проверяет, нет ли новых запросов, берет первый свободный рабочий поток и отдает ему данные для выполнения запроса.
Так же менеджером делается проверка на завершение задачи рабочим потоком.
Как то так) по крайней мере я такую архитектуру обычно у себя реализовываю в случае подобных задач.



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
NieL
Дата 20.3.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



можете поделится примером или ссылкой на статью по такой реализации, чтобы хотя бы в общих чертах понять правильную логику, тема для меня новая. Все что находил - делается либо по первому варианту, либо по второму.
PM MAIL   Вверх
MetalFan
Дата 20.3.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



На этом форуме есть замечательная статья про потоки. После ее прочтения и осмысления никаких вопросов по реализации ранее упомянутого алгоритма возникнуть не должно.


--------------------
There are always someone smarter than you...
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.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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