Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-42649
PONTIY
2002-01-19 12:19
2002.02.14
Вставка NULL в поле TTable.


4-42903
ADM
2001-12-13 06:52
2002.02.14
Звук!!!!!


1-42795
Tomvitas
2002-01-30 23:47
2002.02.14
Как в TStringGrid програмно перенести Selection с одной строки в другую?


3-42698
ТеньЛуны
2002-01-22 17:01
2002.02.14
Microsoft Transaction Server&Borland AppServer


1-42752
BillyJeans
2002-01-31 09:33
2002.02.14
Где взять TDBGridEH?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский