![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Уважаемые программисты, направьте на путь.
Есть список 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;На одном из форумов получил ответ: Цитата:
Подскажите наиболее верное решение. Я только начал знакомиться с потоками. Заранее огромное спасибо |