Добрый день. Есть следующий код потока
Код:
Procedure TStartTHreadLoader.BeginLoadTHreads(const Urls:string);
var
T:TStringList;
Indx1,Indx2:integer;
UrlStr:string; (*Перем для хранения УРЛ при передаче в СТЕК*)
Url:string; (*строка = УРЛ из массива*)
NumOfTHreads:integer; (*число строк с УРЛ переданное из МЕМО*)
UrlStack:TStack<String>; (*объявляем строковый СТЕК*)
begin
T:=TStringList.Create;
T.Text:=Urls;
(*------------ВОПРОС1---------------------*)
CS.Enter; (*вход в КС*)
try
(*инициализация ГлобПЕрем перед циклом.
сделать как метод класса?*)
CurrentNumOfTHreads:=0;
finally
Cs.Leave; (*выход из КС*)
end;
(*----------------------------------*)
NumOfTHreads:=T.Count;
(*---ВОПРОС2 вот тут очень криво, обращение к компонентам основной формы*)
CS.Enter;
try
(*сделать вызов метода метода класса?*)
Form1.Label2.Caption:=IntToStr(NumOfTHreads);
finally
Cs.Leave;
end;
(*---------------------------------------------------------------*)
UrlStack:=TStack<String>.Create(); (*создаем СТЕК типа строка*)
(*---ЦИКЛ ввода строк УРЛ в СТЕК-----*)
for Indx1 := 0 to T.Count-1 do
begin
UrlStr:=T[Indx1];
UrlStack.Push(UrlStr);
end;
(*----------------------------------*)
(*----ЦИКЛ запуска потоков через УРЛ из СТЕК*)
while (UrlStack.Count <> 0) do
(*------------------------------------*)
for Indx2 := 0 to UrlStack.Count-1 do
begin
if (10 > CurrentNumOfTHreads) then
(*----------Вопрос 3----------------*)
begin
CS.Enter;
try
Inc(CurrentNumOfTHreads, 1); (*увеличиваем на +1*)
finally
Cs.Leave;
end;
(*-------------------------*)
if UrlStack.Count <> 0 then
Url:=UrlStack.Pop;
StartLoadTHread(Url); (*вызов процедуры запуска потока закачки страницы*)
Sleep(10); (*интервал между запусками потоков*)
end
else Sleep(5); (*обязательно, иначе процессор вход в перегрузку*)
(*---------------------------*)
end;
(*-----------------------------------------*)
FreeAndNil(UrlStack);
FreeAndNil(T);
end;
Внимание!!! Вопросы:
код помеченный как ВОПРОС1...3 через КС обращается к основному потоку. в случае обращения к объекту в основном потоке надо делать процедуру как метод класса. а в данном случае надо ли делать метод класса из обращения к ГП типа СТРОКА и к ЛЕЙБЛ на основной форме?