Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
15-1294522629
двп
2011-01-09 00:37
2011.06.26
Система удаленного администрирования, потестить


2-1300644733
inslave
2011-03-20 21:12
2011.06.26
многопоточность


15-1298988109
Дмитрий С
2011-03-01 17:01
2011.06.26
Как б встретится?


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


15-1299747769
vuk
2011-03-10 12:02
2011.06.26
Бакшевская Масляница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский