![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Доброго времени суток всем.
Возникли сомнения правильно ли я понимаю, код такой : Создаю класс Код:
unit DataTypes;
....
type
TMyData = class
N1, N2, N3: Integer;
N4, N5: Byte;
public
constructor Create(N1, N2, N3: Integer; N4, N5: Byte;);
end;Код:
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;Код:
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;Код:
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; |
|
#2
|
|||
|
|||
|
Ну, на вид все правильно. Только не вижу использование критических секций.
Так в чем вопрос-то был? |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Помидоркин (24.12.2018)
| ||
|
#3
|
||||
|
||||
|
Цитата:
Цитата:
Цитата:
Несколько смутило как я вновь созданный объект футболю, сначала создаю сразу как элемент списка безо всяких переменных и указателей, потом передаю потоку, а уничтожаю уже как аргумент метода этого потока. Были сомнения действительно ли я его уничтожаю, то что компилятор не ругается меня еще не в чем не убеждает. |
|
#4
|
|||
|
|||
|
Ну включи отчет менеджера памяти (для последних версий Дельфи). Если есть утечки, он отрапортует.
|
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Помидоркин (25.12.2018)
| ||