Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.12.2018, 13:15
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию 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;
В главной форме, в цикле заполняю экземплярами класса 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;
Ответить с цитированием
  #2  
Старый 24.12.2018, 20:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, на вид все правильно. Только не вижу использование критических секций.
Так в чем вопрос-то был?
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Помидоркин (24.12.2018)
  #3  
Старый 24.12.2018, 22:12
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
...Только не вижу использование критических секций...
Цитата:
... (и да, обращение к Queue происходит в критической секции, сокращал код для лучшего восприятия)

Цитата:
Ну, на вид все правильно...
Так в чем вопрос-то был?
Собственно в этом и был вопрос, в целом ответ устраивает.
Несколько смутило как я вновь созданный объект футболю, сначала создаю сразу как элемент списка безо всяких переменных и указателей, потом передаю потоку, а уничтожаю уже как аргумент метода этого потока.
Были сомнения действительно ли я его уничтожаю, то что компилятор не ругается меня еще не в чем не убеждает.
Ответить с цитированием
  #4  
Старый 25.12.2018, 00:39
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну включи отчет менеджера памяти (для последних версий Дельфи). Если есть утечки, он отрапортует.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Помидоркин (25.12.2018)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter