Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2013, 09:34   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию как правильно создавать объекты в потоке?

Добрый день. есть код, который:
- создает поток TLoader
- в потоке создает объекты TIdHTTP, TIdSSLIOHandlerSocketOpenSSL, TIdCompressorZLib, TMemoryStream (для загрузки страницы)
можно создавать все эти объеты в конструкторе и уничтожать в деструкторе и использовать в загрузчике:

Код:
type
  TLoader = class(TThread) (*создаем свой класс на базе ПОТОК*)
  private
     FUrl:string;  
     FText:string; 
     FIdHttp:TidHTTP;
     FSSL:TIdSSLIOHandlerSocketOpenSSL;
     FCompressZLib:TIdCompressorZLib;
     FStream:TMemoryStream;
  protected 
     function LoadURL(const Url: String): string;(*загрузчик страницы: кодировка; удаление скриптов*)
     function LoadHtmlPage(const Url:string):string;   (*закачка простых фреймов, использует LoadURL*)
.....................................
constructor TLoader.Create(const Str,Text:string);
begin
  inherited Create(False); (*Поток создаем в состоянии ЗАПУСК*)
  FIdHttp := TIdHTTP.Create(nil);
  FSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
  FCompressZLib:=TIdCompressorZLib.Create(FIdHttp);
  FStream:=TMemoryStream.Create;
  FreeOnTerminate := True; (* Поток освободит ресурсы при окончании работы*)
  Self.Priority := tpNormal;
  FUrl:=Str; 
  FText:=Text;
end;
..................................
function TLoader.LoadURL(const Url: String):string;
begin
   FIdHttp.IOHandler:=FSSL;
   FIdHttp.Compressor:=FCompressZLib;
   FIdHttp.Get(Url, FStream);
end; (*очень упрощенная версия кода*)
Однако метод LoadURL при загрузке страниц на ФРЕЙМ может вызывться (в выше стоящей функции LoadHtmlPage) многократно

Вопрос: правильно ли создавать объекты в конструкторе или надо перенести их создание в метод LoadURL , с точки зрения правильного кодирования

Код:
function TLoader.LoadURL(const Url: String):string;
begin
FIdHttp := TIdHTTP.Create(nil);
FStream := TMemoryStream.Create;
SSL:=TIdSSLIOHandlerSocketOpenSSL.Create;
CompressZLib:=TIdCompressorZLib.Create(FIdHttp);

   FIdHttp.IOHandler:=FSSL;
   FIdHttp.Compressor:=FCompressZLib;
   FIdHttp.Get(Url, FStream);

FreeAndNil(FStream);
FreeAndNil(SSL);
FreeAndNil(CompressZLib);
FreeAndNil(FIdHttp);
end; (*очень упрощенная версия кода*)
Pcrepair вне форума Ответить с цитированием
Старый 02.04.2013, 12:54   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Так же как и в любом другом объекте никакой разницы.
главное
1. любой объект до использования должен быть создан.
2. для исключения утечек памяти любой созданный объект к моменту потери доступа к нему (к моменту разрушения внешнего объекта/ к моменту выхода из процедуры) должен быть разрушен. можно и не соблюдать если предполагается использование вне.

пара Create Destroy позволяет программисту(не программе) лучше(удобнее) контролировать приведенные требования. и не загромождать основной код своих функций.
Код:
procedure Tx.LoadHTMLPage(..);
begin
  CreateMyOBj; //аналог Сreate

  ....... //главный код процедуры

  FreeMyObj; //аналог Destroy;
end;
C т.з. "правильного" кодинга. (ЗА для Сreate Destroy)
любой блок операторов который требует своего пояснения как единого целого явлется кандидатом на выделения в отдельную функцию. с названием комментирующим (поясняющим) выполняемые действия.
CreateMyObj; // создание внутренних объектов
DestroyMyObj; //удаление внутренних объектов
Если для этого уже предусмотрены функции Create; Destroy; то почему бы ими не воспользоваться.

C т.з. "правильного" кодинга. (ЗА локальные объекты)
Чем ниже область видимости тем лучше
(высокая видимость)public ->protected->private ->Local variable (самая низкая видимость)
Если объект создается,использутся и уничтожается исключительно в одной функции то он должен быть локальным.(Local variable) самая низкая видимость.
function Tx.LoadHTML;
var
HTML: TIdHTML;
...
begin

выделение функций создания(разрущения) внутренних объектов приводит к облегчению кода, но требует перемещения объектов в новую область видимости (private) что повышает уровень видимости (доступности).

Любая программа есть компромисс между скоростью написания, надежностью, читабельностью (восприятие кода человеком), простотой модификации (включая анализ кода), быстродействием и чем-то еще.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.04.2013 в 13:06.
evg_m вне форума Ответить с цитированием
Старый 02.04.2013, 22:53   #3
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию

спасибо за разъяснение, будем пробовать
Pcrepair вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно из потока менять Переменные в другом потоке? Pcrepair Общие вопросы Delphi 6 11.01.2013 11:22
Как правильно создавать и экспортировать файлы ASE ? Vova777 Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 05.05.2012 17:19
как правильно создавать запросы в Sql из Delphi 7 MixanMM БД в Delphi 13 20.07.2010 13:29
Как лучше всего освобождать созданные в потоке объекты? TwiX Общие вопросы Delphi 2 13.03.2010 21:27
Как правильно программно создавать объекты на форме Format C: Общие вопросы Delphi 16 05.07.2007 09:08