Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно из потока менять Переменные в другом потоке?


Страницы:   1 2 3

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]

Удалено модератором


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо