Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.26;
Скачать: CL | DM;

Вниз

многопоточность   Найти похожие ветки 

 
inslave   (2011-03-20 21:12) [0]

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

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;



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;


 
Leon-Z ©   (2011-03-20 22:34) [1]

Первый вариант выброси.
Второй правильней однозначно.
Критические секции тут не нужны ваааще.
Если Вы хотите разделить доступ к Вашему массиву идентификаторов
между потоками, то используйте объекты операционной системы: "event"
или "semaphore" или "mutex".
Если Вы разбираетесь в С++ то посмотрите пример:
"С:\Program Files\Common Files\Borland Shared\MSHelp\Win32.HLP --> Synchronization"


 
Гога Сина   (2011-03-20 22:50) [2]

> Leon-Z ©   (20.03.11 22:34) [1]
> Критические секции тут не нужны ваааще.
> Если Вы хотите разделить доступ к Вашему массиву идентификаторов
> между потоками, то используйте объекты операционной системы:
>  "event"
> или "semaphore" или "mutex".


Из пушки по воробьям.
Чем тебя, несчастный, так обидели критические секции? Или единственно правоверным решением нынче является дерганье системных объектов? Критические секции не кошерно?


 
Loginov Dmitry ©   (2011-03-21 00:54) [3]


> нужна ли тут critical section?


Не ясно, что же должна защищать критическая секция. Обращение к глобальной переменной cur_id? Возможно, но для таких вещей проще использовать InterlockedIncrement().


 
И. Павел ©   (2011-03-21 09:38) [4]

> 0] inslave   (20.03.11 21:12)

Я бы выбрал второй вариан и сделал бы синхронную функцию, которая возвращала бы потоку очередной id. Критическая секция нужна, чтобы два потока не выполнили inc и не получили бы потом одинаковый id.


 
Slym ©   (2011-03-21 11:30) [5]

код своей поделки я выкладывал тут
http://delphimaster.net/view/2-1299918530/


 
Leon-Z ©   (2011-03-21 18:35) [6]


> Гога Сина   (20.03.11 22:50) [2]
> Чем тебя, несчастный, так обидели критические секции?

Да вообщем-то ничем и не обидели.
Просто не привык :)
А для его задачи по-моему подойдет простое объявление
переменной как потоковой:

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


 
Leonid Troyanovsky ©   (2011-03-21 22:31) [7]


> inslave   (20.03.11 21:12)  

Use Synchronize, Luke.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2011.06.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
2-1300644733
inslave
2011-03-20 21:12
2011.06.26
многопоточность


15-1299249466
OW
2011-03-04 17:37
2011.06.26
Спрошу, а вдруг..


15-1299314549
Galera
2011-03-05 11:42
2011.06.26
СБИС - поиск сервера ПГД - и все это через прокси


15-1299015810
Veta
2011-03-02 00:43
2011.06.26
Установка Delphi 7


2-1300360589
IgorB
2011-03-17 14:16
2011.06.26
Порядок отрисовки окон