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


Германн   (2013-01-11 02:16:00) [1]


> Pcrepair ©   (10.01.13 16:57) [32]
>
> Я изучаю программирование в среде RAD, на базе ГОТОВЫХ решений,
>  подробно тут http://validcoderepo.narod.ru/
>

"Ту-104 - самый лучший самолет!"
Поётся на мотив похоронного марша.
:)


Pcrepair   (2013-01-10 23:41:00) [2]

ну если что неправильно, можно прям здесь указать на ошибки.


Anatoly Podgoretsky   (2013-01-10 21:25:00) [3]

> Медвежонок Пятачок  (10.01.2013 20:56:38)  [38]

Откуда ты знаешь, сколько он потратил времени?


Dimka Maslov   (2013-01-10 21:24:00) [4]


> Похоже на сборник стёба.
> Натурально так тупить невозможно.
> Это лет двадцать специально учиться надо.


Ещё как возмозжно. Но большей тупости я нигде не встречал. И двадцать лет не надо учиться, чтобы ТАК тупить.


Игорь Шевченко   (2013-01-10 21:20:00) [5]


> Натурально так тупить невозможно.


Увы


Медвежонок Пятачок   (2013-01-10 20:56:00) [6]

Первая же "Процедура записи....

Похоже на сборник стёба.
Натурально так тупить невозможно.
Это лет двадцать специально учиться надо.


Sha   (2013-01-10 20:39:00) [7]


> Pcrepair ©   (10.01.13 16:57) [32]
> может еще эти...как их .. консоли изучить?хахахаЯ изучаю
> программирование в среде RAD, на базе ГОТОВЫХ решений, подробно
> тут http://validcoderepo.narod.ru/


Первая же "Процедура записи ошибок в ЛОГ-файл на ЖД в каталоге ЕХЕ файла"
и есть одна большая ошибка.
Подробно в учебнике.


Pcrepair   (2013-01-10 20:25:00) [8]


> лучше просто отвечайте на заданные вопросы, себе же нервы
> съэкономите

Я ведь предупреждал


sniknik   (2013-01-10 19:55:00) [9]

у всего есть предел.


Anatoly Podgoretsky   (2013-01-10 18:30:00) [10]

Достал?


sniknik   (2013-01-10 18:05:00) [11]

> может еще эти...как их .. консоли изучить?
если "консольное" то да, а для процедурного паскаль.

> на базе ГОТОВЫХ решений
учатся на базе не решенных ЗАДАНИЙ, и самостоятельном их решении. а ты не изучаешь, ты мозги окружающим компос... ну, т.е. то что ты делаешь как то  по другому называется, только не изучение.


Pcrepair   (2013-01-10 16:57:00) [12]

может еще эти...как их .. консоли изучить?
хахаха
Я изучаю программирование в среде RAD, на базе ГОТОВЫХ решений, подробно тут http://validcoderepo.narod.ru/


sniknik   (2013-01-10 16:26:00) [13]

> но Я тут пока осваиваю процедурное программирование.
тогда осваивай на паскале, без ООП  и событийности, о потоках тоже забудь на время.


Pcrepair   (2013-01-10 16:21:00) [14]


> я тебе то же самое с потоками советовал.

всем спасибо за советы, но Я тут пока осваиваю процедурное программирование. про ООП только теорию немного почитал.


DVM   (2013-01-10 15:39:00) [15]


> Pcrepair ©   (10.01.13 15:13) [27]


> вообще то TStack<String> это не мой, это стандартный объект
> с уже готовыми методами от RAD.
> ты что ? предлагаешь отрихтовать RAD XE3? или ваабще свой
> класс написать?

че там писать то?

 
 TThreadStack = class
 private
   FStack: TStack<String>;
   FLock: TObject;   // Тут в принципе крит секция может быть
 public
   constructor Create;
   destructor Destroy; override;
   function Lock: TStack<String>;
   procedure Unlock; inline;
 end;


примерно так по минимуму будет, остальное погляди в TThreadList


sniknik   (2013-01-10 15:29:00) [16]

> или ваабще свой класс написать?
"ваабще" нафиг, но взять что то за "основу" и перекрыть пару методов? почему нет? я тебе то же самое с потоками советовал.


Pcrepair   (2013-01-10 15:13:00) [17]

DVM

> посмотри как сделано в классе TThreadList, вот тебе надо
> все то же, но вместо TList твой TStack<String>

вообще то TStack<String> это не мой, это стандартный объект с уже готовыми методами от RAD.
ты что ? предлагаешь отрихтовать RAD XE3? или ваабще свой класс написать?


> а "контрольное присваивание" в свою ПЕРЕМ ты случаем не
> делаешь? ну для гарантии, на всякий случай. :)

при полезности можно и контрольный выстрел сделать. на что только не пойдешь для безглючности работы программы


sniknik   (2013-01-10 15:01:00) [18]

> gRestartLoadUrls.Clear(); (*удаляем все строки на всякий случай*)
а "контрольное присваивание" в свою ПЕРЕМ ты случаем не делаешь? ну для гарантии, на всякий случай. :)


DVM   (2013-01-10 14:47:00) [19]


> Pcrepair ©   (10.01.13 14:13) [24]

посмотри как сделано в классе TThreadList, вот тебе надо все то же, но вместо TList твой TStack<String>

еще как вариант, посмотреть как сделано в TThreadedQueue<T> из System.Generics.Collections и сделать по аналогии.


Pcrepair   (2013-01-10 14:13:00) [20]

и все таки не понятно. вот у меня есть ГлобПерем СТЕК
[CODE]
unit uGlobalVar;
interface
uses Classes, SysUtils, SyncObjs, Generics.Collections;
var
CS:TCriticalSection; (*используем КС для передачи результата в основной поток*)
gRestartLoadUrls:TStack<String>; (*объявляем строковый СТЕК для незакачанных УРЛ*)
implementation

initialization
  Cs:=TCriticalSection.Create;
  gRestartLoadUrls:=TStack<String>.Create(); (*создаем СТЕК типа строка*)
  gRestartLoadUrls.Clear(); (*удаляем все строки на всякий случай*)
finalization
 FreeAndNil(CS);
 FreeAndNil(gRestartLoadUrls);
end.
[/CODE]
в которую через КС потоки через gRestartLoadUrls.Add пишут свои строковые данные
по окончании цикла работы, строки накопившиеся в СТЕК потом обрабатываются в потоке, доступ опять через КС и gRestartLoadUrls.Pop

мне что то совершенно непонятно каким образом [B][COLOR="Green"]Если это не метод (не твой пользовательский метод) то сделать обертку над пуш, и перенести работу с кс внутрь ее.[/COLOR][/B]

написать процедуру с использованием СТЕК? в которой использовать КС?
желательно пример, что то о таком вообще не читал


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

Наверх

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