Уважаемые программисты, направьте на путь.
Есть список URL в TStringList. Я забираю данные с этих страниц к себе в базу.
Многопоточность создать удалось, но куча косяков.
Среди них не могу по-челевечески решить следующий вопрос:
Я хочу устанавливать количество одновременно работающих потоков, например 8, а записей пусть 100.
Как мне это верно организовать?
Т.е. мне нужно отслеживать количество работающих потоков, как только какие-то освободились, подгружать новые?
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | unit unit1;
procedure TF_Irr . GetCache(SL:TStringList; threads: integer );
var i,j,thrds,len: integer ;
a: array of TMyThread1;
begin
alive:= 0 ;
i:= 0 ;
thrds:=threads;
len:=SL . Count;
SetLength(a,len);
repeat
if i<=len- 1 then begin
if (len-i)<thrds then begin thrds:=len-i; alive:= 0 ; end ;
if alive<thrds then begin
for j:=i to (thrds-alive- 1 +i) do begin
a[j]:=TMyThread1 . Create( true ,SL[i]);
a[j].Resume;
inc(i);
end ;
end else a[i- 1 ].WaitFor;
end ;
until i>len- 1 ;
end ;
unit thread;
constructor TMyThread1 . Create(CreateSuspended: boolean ; AURL: string );
begin
inherited Create(CreateSuspended);
FURL:=AURL;
InterlockedIncrement(alive);
Priority:=tpHigher;
OnTerminate:=ThreadExit;
end ;
procedure TMyThread1 . ThreadExit(Sender: TObject);
begin
InterlockedDecrement(alive);
synchronize(ShowAlive);
end ;
procedure TMyThread1 . Execute;
var
s,ch: string ;
i: integer ;
inStream: TMemoryStream;
E: Exception;
idHTTP: TIdHTTP;
idCompress:TIdCompressorZLib;
begin
synchronize(ShowResult);
Terminate;
end ;
procedure TMyThread1 . ShowResult;
begin
end ;
|
На одном из форумов получил ответ:
Цитата:
Незачем постоянно создавать-уничтожать потоки, можно просто организовать синхронизированное извлечение следующего URL из списка. Тогда потоков создашь столько, сколько нужно, в начале цикла, а по получении всех адресов они тихо завершатся
|
Подскажите наиболее верное решение. Я только начал знакомиться с потоками.
Заранее огромное спасибо