![]() |
|
|
Регистрация | << Правила форума >> | 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. Пишу программы за еду. __________________ |