![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
многопоточность
inslave © (2011-03-20 21:12:00)есть массив идентификаторов целочисленного типа:
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;
Leonid Troyanovsky (2011-03-21 22:31:00) [1]
> inslave (20.03.11 21:12)
Use Synchronize, Luke.
--
Regards, LVT.
Leon-Z (2011-03-21 18:35:00) [2]
> Гога Сина (20.03.11 22:50) [2]
> Чем тебя, несчастный, так обидели критические секции?
Да вообщем-то ничем и не обидели.
Просто не привык :)
А для его задачи по-моему подойдет простое объявление
переменной как потоковой:
threadvar
IDs: array [1..99] of Integer;
Slym (2011-03-21 11:30:00) [3]код своей поделки я выкладывал тут
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1299918530&n=18
И. Павел (2011-03-21 09:38:00) [4]> 0] inslave (20.03.11 21:12)
Я бы выбрал второй вариан и сделал бы синхронную функцию, которая возвращала бы потоку очередной id. Критическая секция нужна, чтобы два потока не выполнили inc и не получили бы потом одинаковый id.
Loginov Dmitry (2011-03-21 00:54:00) [5]
> нужна ли тут critical section?
Не ясно, что же должна защищать критическая секция. Обращение к глобальной переменной cur_id? Возможно, но для таких вещей проще использовать InterlockedIncrement().
Гога Сина (2011-03-20 22:50:00) [6]> Leon-Z © (20.03.11 22:34) [1]
> Критические секции тут не нужны ваааще.
> Если Вы хотите разделить доступ к Вашему массиву идентификаторов
> между потоками, то используйте объекты операционной системы:
> "event"
> или "semaphore" или "mutex".
Из пушки по воробьям.
Чем тебя, несчастный, так обидели критические секции? Или единственно правоверным решением нынче является дерганье системных объектов? Критические секции не кошерно?
Leon-Z (2011-03-20 22:34:00) [7]Первый вариант выброси.
Второй правильней однозначно.
Критические секции тут не нужны ваааще.
Если Вы хотите разделить доступ к Вашему массиву идентификаторов
между потоками, то используйте объекты операционной системы: "event"
или "semaphore" или "mutex".
Если Вы разбираетесь в С++ то посмотрите пример:
"С:\Program Files\Common Files\Borland Shared\MSHelp\Win32.HLP --> Synchronization"