Форум: "Начинающим";
Текущий архив: 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