![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно из потока менять Переменные в другом потоке?
Pcrepair © (2013-01-08 17:04:00)Добрый день. Есть следующий код потока
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 через КС обращается к основному потоку. в случае обращения к объекту в основном потоке надо делать процедуру как метод класса. а в данном случае надо ли делать метод класса из обращения к ГП типа СТРОКА и к ЛЕЙБЛ на основной форме?
Pcrepair (2013-01-08 21:56:00) [41]вот оно че?
некоторые тут советовали только КС использовать, оно типа быстрее и прчее
при использовании Syncronize необходимы процедуры как метод класса.
а вообще в каких случая использовать КС?
Юрий Зотов (2013-01-08 20:51:00) [42]> надо ли делать метод класса из обращения к ГП типа СТРОКА и к
> ЛЕЙБЛ на основной форме?
Для таких обращений предназначен метод Syncronize.
Учитель (2013-01-08 17:15:00) [43]Удалено модератором