![]() |
|
|
#1
|
|||
|
|||
![]() Добрый день. Не работал раньше с потоками, столкнулся с следующей задачей. Имеется 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; |
#2
|
||||
|
||||
![]() Цитата:
Ещё первый поток может выделить память под данные, заполнить и передать ссылку на этот участок памяти второму потоку, но при этом этот первый поток должен "отказаться" от этих данных, а второй поток после обработки данных должен не забыть освободить память отведённую под них. Цитата:
|