вопрос о потоке. где лучше объявлять объект?

strelok47
Дата: 13.11.2007 19:35:18
есть поток, TThread. внутри него, при Execute объявляется а затем открывается объект TidHTTP - H, поток работает работает в цикле, производит некоторые манипуляции с объектом H, если выполняются некоторые условия, то цикл завершается, вызывается Terminate, после этого вызывается H.free. Так работает сейчас, а не правильнее было бы H открывать при создании потока и прибивать его при destroy'е?
Anatoly Podgoretsky
Дата: 13.11.2007 19:45:28
Правильнее создавать в Create и убивать в Destroy
strelok47
Дата: 13.11.2007 19:56:30
благодарю
Warstone
Дата: 14.11.2007 12:50:46
В корне не согласен... Пример:
В потоке сначала качаем XML таблицу, а потом ее разбираем через какого-нибудь DOM-вендора... Так вот.... Как известно DOM это дело большое и памяти кушает.... Поэтому в Execute сделали Create, скачали, сделали Free, сделали Create DOM-вендору.... Так память экономится, а Create и Free все-равно делать. Тем более если при последующем парсинге случится Exception, то никто за вас Free для IdHTTP делать не будет... Так что... Эффективнее в Конструктор не лазить.
Anatoly Podgoretsky
Дата: 14.11.2007 13:05:01
Ну с твоим знанием твое мнение немного стоит, где делать в Create или Execute значения не имеет, разница только во времени.
Warstone
Дата: 14.11.2007 13:18:38
Ну с твоим знанием неонятно как ты вообще прогерством занимаешься? А если скачать надо не сразу при создании потока, а чуть позже? И тем более Create выполняется в ТЕКУШЕМ потоке, а Execute в НОВОМ Fill the difference! Особенно если в Create'e стоит что-нить типа WaitForSingleObject(smth, INFINITE)
Anatoly Podgoretsky
Дата: 14.11.2007 13:48:51
Ты наверно не знаешь, что Create никакой закачки не делает.
Warstone
Дата: 14.11.2007 14:12:28
Ты наверно не знаешь, что Create в общем случае может много чего делать. Да и если не много... Если это сделать в Execute, то приложение будет работать быстрее так как Создание пойдет уже во 2-м потоке... Кстати, А скажи мне такую вещь.... Если Id перевести в режим Non-Blocking, то ведь тогда он будет кидать сообщения в очередь сообщений, прально? А как он узнает в какую очередь сообщений кидать-то? Прально, берет CurrentProcessId. Теперь, если ты создашь idHTTP в Create, то очередь будет какая? 1-го потока! А во 2-м - ничего не будет. 2 тебе по программированию вообще и по WinAPI в частности. Ну, что ты на это скажешь? Многознающий мой?
Вердикт: В Create у процесса надо только начальные значения ставить.... То есть Create в общем случае должен выглядеть так:
inherited Create(True);
... // тут устанавливаем какие-то значения и работаем с основным потоком
if not CreateSuspended then Resume;