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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.04.2013, 09:37
Pcrepair
 
Сообщения: n/a
По умолчанию как правильно создавать объекты в потоке?

Добрый день. есть код, который:
- создает поток 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; (*очень упрощенная версия кода*)
Ответить с цитированием
  #2  
Старый 02.04.2013, 09:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

нет разницы где их создавать. разница только в требуемой области их видимости.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 02.04.2013, 13:34
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

На вскидку. Объект типа TMemoryStream в процессе работы будет многократно перезаказывать память, так что конструктор - это малая часть выыделения памяти. Другие объекты, которые Вы используете, скорее всего ведут себя похожим образом.
Ответить с цитированием
  #4  
Старый 02.04.2013, 15:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну вот если бы интернет работал с такой скоростью как работает менеджер памяти...)))

Цитата:
С точки зрения правильного кодирования возможны оба варианта, а выбор лучшего зависит от деталей ситуации. Создать объекты один раз в целом лучше, чем создавать-унитожать кучу раз. Но создавать объект перед использованием лучше, чем насоздавать и занимать место без уверенности, что они будут использованы. Большой код лучше разбить на серию мелких методов, следовательно объекты хранить как члены класса, а не как локальные переменные, следовательно создавать в конструкторе. Но объекты часто надёжнее пересоздать, нежели пытаться переиспользовать, особенно если в разных вариантах нужна разная инициализация. В общем, думайте какой код будет лучше в данном случае.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter