Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сказал классу Free, а он продолжает трудиться, почему? [D5]


Страницы:   1 2

newbie2 ©   (2008-02-07 17:42:00) 

Всем привет!
поясните как должен вести себя процесс при Free классу производящему парсинг на основе данных из другого класса?
описание ситуации:
работаю с FastReport3
TfrxReport - класс отчета
TfrxEngine - класс ответственный в частности за парсинг данных в отчете
TfrxReport содержит экземпляр TfrxEngine, а тот в свою очередь ссылку на этот TfrxReport

инициализирую TfrxReport, запускаю построение отчета на основе большого объема данных => отчет строится длительное время
не дождавшись завершения построения отчета делаю FReport.Free (пользователь закрыл форму с отчетом) в TfrxReport.Destroy говорится FEngine.Free, но процесс парсинга в TfrxEngine ещё не завершился и он активно пытается юзать как себя так и TfrxReport, (переменные self и Report = «Inaccessible value»), как следствие возникает Access violation»

теперь собственно вопрос, разве после
TfrxReport.Destroy;
begin
…
FEngine.Free

процесс в FEngine не должен был завершиться?


DrPass   (2008-02-08 10:26:00) [21]


> Amoeba ©   (08.02.08 00:51) [8]
> Для начала перемести вызов inherited в самый конец, где
> ему и полагается быть, в отличие от конструктора

Думаю, разработчики FastReport лучше тебя знают, где полагается вызывать inherited в деструкторе их класса ;-)


sniknik   (2008-02-08 01:04:00) [22]

> FParentForm.Free;
для форм Free неправильно, нужно Release. (см. хелп почему)


Amoeba   (2008-02-08 00:55:00) [23]

И еще. Как деструктор объявлен в описании класса? Есть сильное подозрение, что без override.


Amoeba   (2008-02-08 00:51:00) [24]

Для начала перемести вызов i nheritedв самый конец, где ему и полагается быть, в отличие от конструктора.


newbie2   (2008-02-07 19:20:00) [25]

он примитивен до безобразия:

destructor TfrxReport.Destroy;
begin
 inherited;
 Preview := nil;

 FDatasets.Free;
 FEngineOptions.Free;
 FPreviewOptions.Free;
 FPrintOptions.Free;
 FReportOptions.Free;

 FExpressionCache.Free;
 FScript.Free;
 FScriptText.Free;
 FVariables.Free;
 FEngine.Free;
 FPreviewPages.Free;
 FErrors.Free;
 FStyles.Free;
 FSysVariables.Free;
 FEnabledDataSets.Free;
 FTimer.Free;
 TObject(FDrawText).Free;

 if FParentForm <> nil then
   FParentForm.Free;
end;


Amoeba   (2008-02-07 19:15:00) [26]

Код destructor'а на бочку, please (это автору вопроса).


newbie2   (2008-02-07 18:12:00) [27]


> Плохиш ©   (07.02.08 17:52) [1]
> ...
> Если в деструкторе не стоит код, завершающий поток, то "нет".


можно ли в данном случае закрыть поток, в TfrxEngine обработка потока вроде не предусмотрена, фактически у меня есть только переменная (ссылка на класс)


newbie2   (2008-02-07 18:03:00) [28]

в FR3 к сожалению экстренный выход из парсинга не предусмотрен,
а можно както обработать ситуацию с «Inaccessible value», Assigned в данном случае к сожалению выдает TRUE


Джо   (2008-02-07 17:53:00) [29]

Destroy (и Free) всего-навсего вызывают деструктор объекта, который просто память, занятую объектом, возвращает менеджеру памяти. Ничего сверх этого он делать не обязан.


Плохиш   (2008-02-07 17:52:00) [30]


> теперь собственно вопрос, разве после
> TfrxReport.Destroy;
> begin
> …
> FEngine.Free
> процесс в FEngine не должен был завершиться?

Если в деструкторе не стоит код, завершающий поток, то "нет".


Игорь Шевченко   (2008-02-07 17:52:00) [31]

Наверное надо сначала остановить парсинг ? Особенно если он идет отдельным потоком.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо