Доброго времени суток всем.
Возникли сомнения правильно ли я понимаю, код такой :
Создаю класс
Код:
1 2 3 4 5 6 7 8 9 10 | unit DataTypes;
....
type
TMyData = class
N1, N2, N3: Integer ;
N4, N5: Byte ;
public
constructor Create(N1, N2, N3: Integer ; N4, N5: Byte ;);
end ;
|
В главной форме, в цикле заполняю экземплярами класса TMyData ObjectList
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | unit Unit1;
...................
type
TForm1 = class (TForm)
.................
end ;
var
Form1: TForm1;
Queue: TObjectList<TObject>;
implementation
{$R *.dfm}
procedure TForm1 . FormCreate(Sender: TObject);
begin
Queue:= TObjectList<TObject>.Create;
end ;
procedure TForm1 . FormDestroy(Sender: TObject);
begin
Queue . Free;
end ;
procedure TForm1 . btn1(Sender: TObject);
var Indx: Integer ;
begin
Queue . Clear;
............
for Indx := 0 to do
begin
Queue . Add(TMyData . Create( ));
end ;
................
end ;
|
Передаю список объектов потоку (и да, обращение к Queue происходит в критической секции, сокращал код для лучшего восприятия)
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | unit DLThrd;
interface
............
type
TDLThrd = class (TThread)
private
...........
FQueue: TObjectList<TObject>;
FData: TObject;
procedure SomeProcedure(AData: TMyData);
..............
protected
procedure Execute; override;
public
constructor Create(AQueue: TObjectList<TObject>);.
end ;
implementation
constructor TDLThrd . Create(AQueue: TObjectList<TObject>);
begin
inherited Create( False );
FQueue:= AQueue;
FData:= nil ;
...........
end ;
|
В Execute извлекаю объект из списка как TObject и передаю его как TMyData некой процедуре для работы
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | procedure TDLThrd . Execute;
begin
................
If FQueue . Count > 0 then
FData:= FQueue . Extract(FQueue . First);
..................
if FData <> nil then
SomeProcedure(TMyData(FData));
..................
end ;
procedure SomeProcedure(AData: TMyData);
var i: Ineger;
s: string ;
begin
i:= AData . n1;
s:= IntToStr(AData . n2);
......................
AData . Free;
end ;
|
Зачем такие сложности? Дело в том что классы с данными будут разные и обрабатываться они будут разными процедурами.
Собственно вопрос в том, правильно ли я понимаю всю эту кухню - я создаю список объектов, передаю его потокам (их будет несколько) и потоки через FQueue производят манипуляции с этим списком т.е. выдергивают объект из списка (FQueue.Extract), все в списке объекта уже нет, но сам объект "жив" и общаюсь я с ним через FData. Передаю его другой процедуре и уже в ней получив от объекта нужные мне данные "убиваю" его.
Как вариант:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | procedure TDLThrd . Execute;
begin
................
SomeProcedure(TMyData(FData));
FData . Free;
..................
end ;
procedure SomeProcedure(AData: TMyData);
var i: Ineger;
s: string ;
begin
i:= AData . n1;
s:= IntToStr(AData . n2);
......................
end ;
|