Добрый день. Не работал раньше с потоками, столкнулся с следующей задачей. Имеется stringlist,
в нем некоторое количество например ссылок. для каждой ссылки создаю поток(MyTh1), скачиваю в нем
информацию, разбитую на блоки. Каждый блок нужно обработать в потоках(MyTh2), количество которых
ограниченно threadscount. вопрос в том, как передать данные для обработки в виде массива из TMyRecord1 в поток MyTh2,
если он локален в первом потоке...
Заранее спасибо за советы.
Код:
TMyRecord1=record
var1:string;
var2:integer;
end;
TMyRecord2=record
var1:string;
var2:integer;
end;
TMyTh1=class(TTHread)
..
TMyTh2=class(TThread)
private
arraylength:word;
..
var
result:array of TMyRecord2;
current1,current2:Word;
procedure start;
var
target:Tstringlist;
MyThs1=array of TMyTh1;
begin
current1:=0;
for i:=0 to Target.count -1 do
begin
SetLength(MyThs1,i+1);
MyThs1[i]:=Myths1.Create(false);
end;
end;
procedure MyTh1.Execute;
var
cs:tcriticalsection;
targetline:string;
target2:array of TMyRecord1;
myths2:array of Myth2;
begin
cs:=tcriticalsection.create;
cs.enter;
targetline:=Target[i];
inc(i);
cs.leave;
cs.free;
while process(targetline) do
begin
l:=length(target2);
setlength(target2,l+1);
target2.var1:=...
target2.var2:=...
end;
setlength(myth2,threadscount);
for i=0 to threadscount - 1 do
begin
myths2[i]:=Tmyth2.create(true);
myths2[i].arraylength:=length(target2);
end;
end;
Procedure MyTh2.execute;
var
cs:tcriticalsection;
begin
cs:=tcriticalsection.create;
while i<arraylength do
begin
cs.enter;
inc(i);
cs.leave;
//здесь надо обработать массив target2
//и записать результаты в массив result,
//общий для всех потоков...
end;
cs.free;
end;