Доброго времени суток всем.
Возникли сомнения правильно ли я понимаю, код такой :
Создаю класс
Код:
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
Код:
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 {Count-1} do
begin
Queue.Add(TMyData.Create({заполняю данными}));
{тут какбэ полиморфизм TObjectList<TObject>.Add(TMyData)}
end;
................
end;
Передаю список объектов потоку (и да, обращение к Queue происходит в критической секции, сокращал код для лучшего восприятия)
Код:
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 некой процедуре для работы
Код:
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
{здесь получаю из AData данные
и совершаю с ними некие действия}
i:= AData.n1;
s:= IntToStr(AData.n2);
......................
//уничтожаю объект
AData.Free;
end;
Зачем такие сложности? Дело в том что классы с данными будут разные и обрабатываться они будут разными процедурами.
Собственно вопрос в том, правильно ли я понимаю всю эту кухню - я создаю список объектов, передаю его потокам (их будет несколько) и потоки через FQueue производят манипуляции с этим списком т.е. выдергивают объект из списка (FQueue.Extract), все в списке объекта уже нет, но сам объект "жив" и общаюсь я с ним через FData. Передаю его другой процедуре и уже в ней получив от объекта нужные мне данные "убиваю" его.
Как вариант:
Код:
procedure TDLThrd.Execute;
begin
................
SomeProcedure(TMyData(FData));
FData.Free;
..................
end;
procedure SomeProcedure(AData: TMyData);
var i: Ineger;
s: string;
begin
{здесь получаю из AData данные
и совершаю с ними некие действия}
i:= AData.n1;
s:= IntToStr(AData.n2);
......................
end;