Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.01.2013, 18:49
Pcrepair
 
Сообщения: n/a
По умолчанию Как правильно из потока менять Переменные в другом потоке?

Добрый день. Есть следующий код потока

Код:
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 через КС обращается к основному потоку. в случае обращения к объекту в основном потоке надо делать процедуру как метод класса. а в данном случае надо ли делать метод класса из обращения к ГП типа СТРОКА и к ЛЕЙБЛ на основной форме?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025