Форум: "Основная";
Текущий архив: 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]спасибо за подробное объяснение сейчас попробую разобраться
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c