Показать сообщение отдельно
  #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; (*очень упрощенная версия кода*)
Ответить с цитированием