![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сказал классу Free, а он продолжает трудиться, почему? [D5]
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]Наверное надо сначала остановить парсинг ? Особенно если он идет отдельным потоком.