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