|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
TObject и TObjectList
Доброго времени суток всем.
Возникли сомнения правильно ли я понимаю, код такой : Создаю класс Код:
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)
|