Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.032 c
2-1201985154
Бэтман
2008-02-02 23:45
2008.03.02
edit


2-1202227203
NiGGa
2008-02-05 19:00
2008.03.02
Ошибка Delphi при запуске своего приложения


2-1201957369
olevacho_
2008-02-02 16:02
2008.03.02
Двоколоночный отчет


15-1201467030
Иксик
2008-01-27 23:50
2008.03.02
Очень нужен кто-нибудь с американским IP


2-1202156692
Owa
2008-02-04 23:24
2008.03.02
Чтение из 2-х гигового лога...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский