Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.02;
Скачать: CL | DM;

Вниз

сказал классу 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.022 c
2-1202065033
San1712
2008-02-03 21:57
2008.03.02
Как узнать начальный и последний адрес программы в памяти ?


2-1202395681
andreoman
2008-02-07 17:48
2008.03.02
как найти узел впри помощи SimpleXML


8-1175162015
YadlU
2007-03-29 13:53
2008.03.02
Дата время разность двух дат


2-1202412877
Igit
2008-02-07 22:34
2008.03.02
Вопрос по ООП


2-1202207209
Igora
2008-02-05 13:26
2008.03.02
Найти часть строки в StringList