Форум: "Начинающим";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];
Внизсказал классу Free, а он продолжает трудиться, почему? Найти похожие ветки
← →
newbie2 (2008-02-07 17:42) [0]Всем привет!
поясните как должен вести себя процесс при 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 не должен был завершиться?
← →
Плохиш © (2008-02-07 17:52) [1]
> теперь собственно вопрос, разве после
> TfrxReport.Destroy;
> begin
> …
> FEngine.Free
> процесс в FEngine не должен был завершиться?
Если в деструкторе не стоит код, завершающий поток, то "нет".
← →
Игорь Шевченко © (2008-02-07 17:52) [2]Наверное надо сначала остановить парсинг ? Особенно если он идет отдельным потоком.
← →
Джо © (2008-02-07 17:53) [3]Destroy (и Free) всего-навсего вызывают деструктор объекта, который просто память, занятую объектом, возвращает менеджеру памяти. Ничего сверх этого он делать не обязан.
← →
newbie2 (2008-02-07 18:03) [4]в FR3 к сожалению экстренный выход из парсинга не предусмотрен,
а можно както обработать ситуацию с «Inaccessible value», Assigned в данном случае к сожалению выдает TRUE
← →
newbie2 (2008-02-07 18:12) [5]
> Плохиш © (07.02.08 17:52) [1]
> ...
> Если в деструкторе не стоит код, завершающий поток, то "нет".
можно ли в данном случае закрыть поток, в TfrxEngine обработка потока вроде не предусмотрена, фактически у меня есть только переменная (ссылка на класс)
← →
Amoeba © (2008-02-07 19:15) [6]Код destructor"а на бочку, please (это автору вопроса).
← →
newbie2 (2008-02-07 19:20) [7]он примитивен до безобразия:
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-08 00:51) [8]Для начала перемести вызов inherited в самый конец, где ему и полагается быть, в отличие от конструктора.
← →
Amoeba © (2008-02-08 00:55) [9]И еще. Как деструктор объявлен в описании класса? Есть сильное подозрение, что без override.
← →
sniknik © (2008-02-08 01:04) [10]> FParentForm.Free;
для форм Free неправильно, нужно Release. (см. хелп почему)
← →
DrPass © (2008-02-08 10:26) [11]
> Amoeba © (08.02.08 00:51) [8]
> Для начала перемести вызов inherited в самый конец, где
> ему и полагается быть, в отличие от конструктора
Думаю, разработчики FastReport лучше тебя знают, где полагается вызывать inherited в деструкторе их класса ;-)
← →
DrPass © (2008-02-08 10:30) [12]
> sniknik © (08.02.08 01:04) [10]
> > FParentForm.Free;
> для форм Free неправильно, нужно Release. (см. хелп почему)
Почему? Если бы это вызывалось из обработчика событий самой формы, тогда да, Release. А если Free делает невизуальная компонента, которая к форме прямого отношения не имеет (в смысле, через Owner), то Free вполне уместен
← →
Anatoly Podgoretsky © (2008-02-08 10:40) [13]> DrPass (08.02.2008 10:30:12) [12]
Более чем уместен, поскольку с Release можно получить серьезные грабли.
Release только для вызова внутри формы, которую надо уничтожить.
К сожалению многие писатели растиражировали Release не понимая как это работает.
← →
Palladin © (2008-02-08 10:45) [14]Та помоему DrPass"а в этом убеждать не нуна... он это сам сказал :)
← →
Palladin © (2008-02-08 10:47) [15]Мне вообще не понятна ситуация, чего там с потоком, почему он должен остановиться и кто его реализовал, автор темы или авторы фастрепорта
← →
sniknik © (2008-02-08 10:50) [16]да что там непонятного, тот же free только поставленный в очередь комманд.
но по вопросу, после free еще идет обработка, т.е. гдето поток еще не завершился, завершится будет "дестрой" и т.д. может обращение к форме (возможно поток в ней), а формы то уже и нет.
← →
Anatoly Podgoretsky © (2008-02-08 10:51) [17]
> Та помоему DrPass"а в этом убеждать не нуна... он это сам
> сказал :)
Да я и не убеждаю. Я дополняю.
← →
ketmar © (2008-02-08 10:54) [18]а почему бы не дать ему завершиться? форма закрылась? и фиг с ней. спрятать, а убивать, когда оно отчёт допиляет.
---
Understanding is not required. Only obedience.
← →
newbie2 (2008-02-08 11:08) [19]
> ketmar © (08.02.08 10:54) [18]
> а почему бы не дать ему завершиться? форма закрылась? и
> фиг с ней. спрятать, а убивать, когда оно отчёт допиляет.
к сожалению моя форма часть большого проекта, и на данный вариант директорат врядли пойдет
> Amoeba © (08.02.08 00:51) [8]
> Для начала перемести вызов inherited в самый конец, где
> ему и полагается быть, в отличие от конструктора.
пробовал танцы с бубнами эффекта не дали :(
> Palladin © (08.02.08 10:47) [15]
> Мне вообще не понятна ситуация, чего там с потоком, почему
> он должен остановиться и кто его реализовал, автор темы
> или авторы фастрепорта
Free я говорю компоненту FR3, вся дальнейшая обработка идет там
фактически подобная ситуация должна быть очень распространена и может быть в любом проекте где есть очень времяемкий процесс со сложным окружением (юзающим элементы компонентов которые должны рождатся и умирать вместе), а если так то наверняка есть более-менее стандартные решения?
поясните такой момент, если поток ещё не завершен то почему Self и переменные в том классе, выпали из зоны видимости?
← →
Palladin © (2008-02-08 11:09) [20]
> Free я говорю компоненту FR3, вся дальнейшая обработка идет
> там
это понятно, функция потока кем реализована, ну, блин, то что он делает кто написал, ты или авторы фастрепорта?
← →
oxffff © (2008-02-08 11:13) [21]
> newbie2 (08.02.08 11:08) [19]
А что тебе мешает сделать ICallBackCancelCommand?
← →
newbie2 (2008-02-08 11:15) [22]
> Palladin © (08.02.08 11:09) [20]
> это понятно, функция потока кем реализована, ну, блин, то
> что он делает кто написал, ты или авторы фастрепорта?
авторы FR3
> oxffff © (08.02.08 11:13) [21]
> А что тебе мешает сделать ICallBackCancelCommand?
признаться не было опыта даботы с этим, в двух словах на пальцах с чем его едят?
← →
Palladin © (2008-02-08 11:17) [23]
> [22] newbie2 (08.02.08 11:15)
тогда остановка потока от тебя не зависит, если авторы этого не предусмотрели, он будет работать пока не решит что уже пора прекратить...
← →
ketmar © (2008-02-08 11:18) [24]>[19] newbie2 (2008-02-08 11:08:00)
>на данный вариант директорат врядли пойдет
а ты никому не говори, что так сделано. %-)
---
Understanding is not required. Only obedience.
← →
newbie2 (2008-02-08 11:22) [25]
> Palladin © (08.02.08 11:17) [23]
>
> > [22] newbie2 (08.02.08 11:15)
>
> тогда остановка потока от тебя не зависит, если авторы этого
> не предусмотрели, он будет работать пока не решит что уже
> пора прекратить...
да понятно, что нужно компонент модернизировать, собственно и без этого я уже многое изменил для нужд конторы
собственно вопрос изначально был что это такое за ситуация, и как малой кровью (без создания своего FR с нуля её можно разрулить)
и все таки повторю один из вопросов оставшихся без ответа:
а можно както обработать ситуацию с «Inaccessible value», Assigned в данном случае к сожалению выдает TRUE
← →
Amoeba © (2008-02-08 11:25) [26]
> newbie2 (08.02.08 11:08) [19]
>
> > Amoeba © (08.02.08 00:51) [8]
> > Для начала перемести вызов inherited в самый конец, где
> > ему и полагается быть, в отличие от конструктора.
>
> пробовал танцы с бубнами эффекта не дали :(
>
Ты так и не ответил, деструктор виртуальный? Директива override в его объявлении есть?
← →
Palladin © (2008-02-08 11:26) [27]при закрытии формы пользователем просто делать ее невидимой, ставить ожидание на окончание отработки потока фастр репорта и по сигналу уже все уничтожать
← →
newbie2 (2008-02-08 11:31) [28]
> Amoeba © (08.02.08 11:25) [26]
> Ты так и не ответил, деструктор виртуальный? Директива override
> в его объявлении есть?
извините, да деструктор у класа TfrxReport переопределенный, override стоит
← →
ketmar © (2008-02-08 11:37) [29]>[27] Palladin (2008-02-08 11:26:00)
нечестно! я это уже предлагал! %-)
---
Understanding is not required. Only obedience.
← →
Palladin © (2008-02-08 11:46) [30]точна... ну тогда пусть прочитает [18], а потом вернется к [27] если какие то спецефические термины будут не понятны :)
← →
newbie2 (2008-02-08 12:10) [31]а можно както обработать ситуацию с «Inaccessible value», Assigned в данном случае к сожалению выдает TRUE
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.07 c