|
|
Регистрация | << Правила форума >> | 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; На одном из форумов получил ответ: Цитата:
Подскажите наиболее верное решение. Я только начал знакомиться с потоками. Заранее огромное спасибо |