|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
как правильно создавать объекты в потоке?
Добрый день. есть код, который:
- создает поток 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
|
||||
|
||||
нет разницы где их создавать. разница только в требуемой области их видимости.
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
На вскидку. Объект типа TMemoryStream в процессе работы будет многократно перезаказывать память, так что конструктор - это малая часть выыделения памяти. Другие объекты, которые Вы используете, скорее всего ведут себя похожим образом.
|
#4
|
||||
|
||||
ну вот если бы интернет работал с такой скоростью как работает менеджер памяти...)))
Цитата:
Пишу программы за еду. __________________ |