Уважаемые программисты, направьте на путь.
Есть список URL в TStringList. Я забираю данные с этих страниц к себе в базу.
Многопоточность создать удалось, но куча косяков.
Среди них не могу по-челевечески решить следующий вопрос:
Я хочу устанавливать количество одновременно работающих потоков, например 8, а записей пусть 100.
Как мне это верно организовать?
Т.е. мне нужно отслеживать количество работающих потоков, как только какие-то освободились, подгружать новые?
Код:
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;
//FreeOnTerminate:=true;
OnTerminate:=ThreadExit;
//Resume;
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
//куда-нить записываю данные, пусть в memo
end;
На одном из форумов получил ответ:
Цитата:
Незачем постоянно создавать-уничтожать потоки, можно просто организовать синхронизированное извлечение следующего URL из списка. Тогда потоков создашь столько, сколько нужно, в начале цикла, а по получении всех адресов они тихо завершатся
|
Подскажите наиболее верное решение. Я только начал знакомиться с потоками.
Заранее огромное спасибо