![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Имеется массив целочисленных идентификаторов:
.., 1, 2, 7, 9, 10, 21, 23, ... Задача: перебрать массив в несколько потоков (Поток будет брать из массива значение, подставлять его в get-запрос и отправлять на web-сервер (пишу утилиту для проверки существования картинок на web-сервере)). Собственно вопрос, как скармливать потоку значения массива, чтобы избежать одновременного доступа к ожному и тому же значению массива из других потоков. Все что находил - не фонтан, хотелось бы увидеть грамотный подход к этому вопросу. Наткнулся на похожий вопрос на одном из форумов, там советовали использовать пул потоков. Начал копать в сторону TIdSchedulerOfThreadPool. Описания его работы, примеров использования - ничего не нашел. |
|
#2
|
||||
|
||||
|
Critical Section Objects
Код:
unit Unit1;
interface
uses
SyncObjs,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
CriticalSection: TCriticalSection;
ArrID: array [0..6] of Integer = (1, 2, 7, 9, 10, 21, 23);
CurrentID: Integer;
implementation
{$R *.dfm}
function GetNextArrID: Integer;
begin
CriticalSection.Enter;
try
if CurrentID<Length(ArrID) then Result:=ArrID[CurrentID] else Result:=-1;
Inc(CurrentID);
finally
CriticalSection.Leave;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(GetNextArrID);
end;
initialization
CriticalSection:=TCriticalSection.Create;
CurrentID:=0;
finalization
CriticalSection.Free;
end. |