Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];




Вниз

Формирование массива 


Eraser   (2002-01-31 09:45) [0]

Знающие просвятите: есть 3 разных потока в 3-х ThreadObject-ах.
В главной форме они определены как
T1:TMicro1Thread;
T2:TMicro2Thread;
T3:TMicro3Thread;
Нужно менять <<номер потока>> с которым работаешь (Т<<номер потока>>), чтобы 3 раза не переписывать работу с каждым в отдельности, например для первого потока
T1.Suspend;
T1.Setuprpub(1,upr[1]);//определение переменной в потоке
T1.Resume;
тоже самое для второго только меняем номер потока и т.д.

для компонентов есть свойство FindComponent через которое можно это было сделать , а как быть в моей ситуации
Заранее спасибо



NailS   (2002-01-31 11:03) [1]

Создай обычный TList и при создании потока добавляй его туда.
Обращаться к потоку будешь по индексу
var
i : integer;
begin
while i < FList.Count do
begin
TMicro3Thread(FList[i]).Resume;
Inc(i);
end;



Digitman   (2002-01-31 11:29) [2]


type
TTreadArray = array[1..3] of TThread;

var
ThreadArray: TTreadArray;
ThreadNum: Integer;
...
ThreadArray[1]:= TMicro1Thread.Create(..);
ThreadArray[2]:= TMicro2Thread.Create(..);
ThreadArray[3]:= TMicro3Thread.Create(..);
...
case ThreadNum of
1: with TMicro1Thread(ThreadArray[1]) do begin
Suspend;
Setuprpub(1,upr[1]);
Resume;
end;
2: with TMicro2Thread(ThreadArray[2]) do begin
Suspend;
Setuprpub(1,upr[1]);
Resume;
end;
3: with TMicro3Thread(ThreadArray[3]) do begin
Suspend;
Setuprpub(1,upr[1]);
Resume;
end;
end;


Только вот непонятно, метод Setuprpub() виртуальный у предка всех трех MicroThread"ов ? Или предок у них - TThread ?

Если бы Setuprpub() был виртуально объявленный у единого предка всех трех объектов, то было бы еще проще:


type
TMicroThread = class(TThread)
public
procedure Setuprpub(..); virtual; abstract;
end;

TMicro1Thread = class(TMicroThread)
protected
procedure Execute; override;
public
procedure Setuprpub(..); override;
end;

TMicro2Thread = class(TMicroThread)
protected
procedure Execute; override;
public
procedure Setuprpub(..); override;
end;

TMicro3Thread = class(TMicroThread)
protected
procedure Execute; override;
public
procedure Setuprpub(..); override;
end;

TTreadArray = array[1..3] of TMicroThread;

var
ThreadArray: TTreadArray;
ThreadNum: Integer;
...
ThreadArray[1]:= TMicro1Thread.Create(..);
ThreadArray[2]:= TMicro2Thread.Create(..);
ThreadArray[3]:= TMicro3Thread.Create(..);
...
for i:= 1 to 3 do
with ThreadArray[i] do begin
Suspend;
Setuprpub(..);
Resume;
end;
...


разницу чувствуешь ?)



Eraser   (2002-01-31 12:34) [3]

to Digitman
TMicro1Thread=class(TThread)
TMicro2Thread=class(TThread)
TMicro3Thread=class(TThread)
у них свойства и переменные одни и теже. Описаны в разных Unit"ах только из-за того что передаются в них и принимаются из них разные параметры. Я мучался со следующим кодом:
..основная форма
T:array [1..3] of TSortThread;

procedure TSortForm.StartBtnClick(Sender: TObject);
begin
T[1]:=TSortThread.Create(1,5);//Create(FirstParameter,NextParameter)
T[2]:=TSortThread.Create(2,4);
T[3]:=TSortThread.Create(3,6);
StartBtn.Enabled := False;
end;

..поток

type
TSortThread = class(TThread)
private
FFirstPar: integer;
FNextPar: integer;
public
Fs: integer;
procedure Sets(const Value: integer);
property s:integer read Fs write Sets;
procedure Execute; override;
constructor Create(const FirstParameter, NextParameter: integer);
end;

implementation

procedure TSortThread.Sets(const Value: integer);
begin
Fs := Value;
end;

constructor TSortThread.Create(const FirstParameter, NextParameter: integer);
begin
inherited Create(True);
FreeOnTerminate := True;
FFirstPar := FirstParameter; //Инициализация переменных
FNextPar := NextParameter;
Resume; //Переводим поток в состояние «Активный»
end;

procedure TSortThread.Execute;
var i:integer;
begin
while not Terminated do
begin
case FFirstPar of
1:for i:=1 to 10000 do
Fs:=Fs+FNextPar;
2:for i:=1 to 10000 do
Fs:=Fs+FNextPar;
3:for i:=1 to 10000 do
Fs:=Fs+FNextPar;
end;

end;
end;
создаю 3 разных потока - это все работает. Но не могу мернуть значение из каждого потока (из конкретного) по отдельности???



Digitman   (2002-01-31 13:12) [4]

>>"Но не могу мернуть значение из каждого потока (из конкретного) по отдельности???"

это почему же ? ResultFs:= T[i].s, где i - индекс конкр.объекта SortThread в созданном тобой массиве этих объектов



Eraser   (2002-01-31 13:57) [5]

Скажите если я не прав :
1.В основной форме прерываю поток
Т[1].Suspend;
2.В основной форме пишу
resultfs:=Т[1];
3.Запускаю поток
Т[1].Resume;
4.Пользуюсь переменной Fs в основной форме.

Прав ли я??
И вообще т.к. код одинаков если я напишу

procedure TSortThread.Execute;
var i:integer;
begin
while not Terminated do
case FFirstPar of
1:Work(FNextPar);
2:Work(FNextPar);
3:Work(FNextPar);
end;

procedure work(FNextPar:Integer);
begin
for i:=1 to 10000 do fs:=fs+1
end;

то вышеописанное об обращении к Fs не изменится??



Digitman   (2002-01-31 14:33) [6]

Все твои беды от путаницы в понятиях "переменная", "поле класса", "поле объекта", "значение, присвоенное переменной", "значение, присвоенное полю объекта".

Ну вот прокомментируй, к примеру :


1.В основной форме прерываю поток
Т[1].Suspend;


Форма и поток - совершенно разные понятия : форма - VCL-объект, а поток - доп.кодовый поток как ОС- или VCL-объект.
В дан.случае ты просто приостанавливаешь доп.поток ИЗ ВНЕШНЕГО
(по отн-ю к приостанавливаемому) ПОТОКА


2.В основной форме пишу
resultfs:=Т[1];


пишешь ты не в форме, а в коде некоего модуля, реализующего функц-ть объекта-формы. Какой тип, кстати, имеет идент-р resultfs ? Судя этой по строчке и вышеупомянотому примеру - тип TSortThread


3.Запускаю поток
Т[1].Resume;

ок. возобновляешь выполнение потока как ОС-объекта


4.Пользуюсь переменной Fs в основной форме.

Что это за переменная ? Какого она типа ? Где она объявлена ?
Судя по вышеупомянотому примеру, это вовсе и не переменная, а поле класса TSortThread. Для каждого из 3-х созданных тобой объектов-экземпляров этого класса в памяти будет существовать отдельное ПОЛЕ отдельного ОБЪЕКТА. Все эти 3 поля имеют один и тот же тип - Integer, но могут иметь совершенно различные ЗНАЧЕНИЯ (поскольку контролируются различными потоками, как объектами ОС), каждое из которых в отдельности ты и хочешь, видимо, получить, чтобы воспользоваться им в другом потоке (в дан.случае - основном)



Eraser   (2002-01-31 16:24) [7]

спасибо за подробное объяснение сейчас попробую разобраться




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.028 c
3-42706           VV                    2002-01-18 10:58  2002.02.14  
Из Oracle в локальную БД


1-42799           Ron                   2002-01-24 00:10  2002.02.14  
Printer


1-42725           Tkach                 2002-01-16 11:40  2002.02.14  
Документ в формате RTF


1-42746           UserL                 2002-01-29 08:27  2002.02.14  
Помогите, плиз...


3-42643           harismatik            2002-01-17 16:48  2002.02.14  
Добавление нового юзера и назначение ему прав доступа к базе данных INTERBASE