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 не должен был завершиться?


newbie2   (2008-02-08 12:10:00) [1]

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


Palladin   (2008-02-08 11:46:00) [2]

точна... ну тогда пусть прочитает [18], а потом вернется к [27] если какие то спецефические термины будут не понятны :)


ketmar   (2008-02-08 11:37:00) [3]

>[27] Palladin (2008-02-08 11:26:00)
нечестно! я это уже предлагал! %-)

---
Understanding is not required. Only obedience.


newbie2   (2008-02-08 11:31:00) [4]


> Amoeba ©   (08.02.08 11:25) [26]
> Ты так и не ответил, деструктор виртуальный? Директива override
> в его объявлении есть?

извините, да деструктор у класа TfrxReport переопределенный, override  стоит


Palladin   (2008-02-08 11:26:00) [5]

при закрытии формы пользователем просто делать ее невидимой, ставить ожидание на окончание отработки потока фастр репорта и по сигналу уже все уничтожать


Amoeba   (2008-02-08 11:25:00) [6]


> newbie2   (08.02.08 11:08) [19]
>

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


Ты так и не ответил, деструктор виртуальный? Директива override в его объявлении есть?


newbie2   (2008-02-08 11:22:00) [7]


> Palladin ©   (08.02.08 11:17) [23]
>
> >  [22] newbie2   (08.02.08 11:15)
>
> тогда остановка потока от тебя не зависит, если авторы этого
> не предусмотрели, он будет работать пока не решит что уже
> пора прекратить...

да понятно, что нужно компонент модернизировать, собственно и без этого я уже многое изменил для нужд конторы
собственно вопрос изначально был что это такое за ситуация, и как малой кровью (без создания своего FR с нуля её можно разрулить)

и все таки  повторю один из вопросов оставшихся без ответа:

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


ketmar   (2008-02-08 11:18:00) [8]

>[19] newbie2 (2008-02-08 11:08:00)
>на данный вариант директорат врядли пойдет
а ты никому не говори, что так сделано. %-)

---
Understanding is not required. Only obedience.


Palladin   (2008-02-08 11:17:00) [9]


>  [22] newbie2   (08.02.08 11:15)

тогда остановка потока от тебя не зависит, если авторы этого не предусмотрели, он будет работать пока не решит что уже пора прекратить...


newbie2   (2008-02-08 11:15:00) [10]


> Palladin ©   (08.02.08 11:09) [20]
> это понятно, функция потока кем реализована, ну, блин, то
> что он делает кто написал, ты или авторы фастрепорта?

авторы FR3


> oxffff ©   (08.02.08 11:13) [21]
> А что тебе мешает сделать ICallBackCancelCommand?

признаться не было опыта даботы с этим, в двух словах на пальцах с чем его едят?


oxffff   (2008-02-08 11:13:00) [11]


> newbie2   (08.02.08 11:08) [19]


А что тебе мешает сделать ICallBackCancelCommand?


Palladin   (2008-02-08 11:09:00) [12]


> Free я говорю компоненту FR3, вся дальнейшая обработка идет
> там

это понятно, функция потока кем реализована, ну, блин, то что он делает кто написал, ты или авторы фастрепорта?


newbie2   (2008-02-08 11:08:00) [13]


> 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 и переменные в том классе, выпали из зоны видимости?


ketmar   (2008-02-08 10:54:00) [14]

а почему бы не дать ему завершиться? форма закрылась? и фиг с ней. спрятать, а убивать, когда оно отчёт допиляет.

---
Understanding is not required. Only obedience.


Anatoly Podgoretsky   (2008-02-08 10:51:00) [15]


> Та помоему DrPass'а в этом убеждать не нуна... он это сам
> сказал :)

Да я и не убеждаю. Я дополняю.


sniknik   (2008-02-08 10:50:00) [16]

да что там непонятного, тот же free только поставленный в очередь комманд.

но по вопросу, после free еще идет обработка, т.е. гдето поток еще не завершился, завершится будет "дестрой" и т.д. может обращение к форме (возможно поток в ней), а формы то уже и нет.


Palladin   (2008-02-08 10:47:00) [17]

Мне вообще не понятна ситуация, чего там с потоком, почему он должен остановиться и кто его реализовал, автор темы или авторы фастрепорта


Palladin   (2008-02-08 10:45:00) [18]

Та помоему DrPass'а в этом убеждать не нуна... он это сам сказал :)


Anatoly Podgoretsky   (2008-02-08 10:40:00) [19]

> DrPass  (08.02.2008 10:30:12)  [12]

Более чем уместен, поскольку с Release можно получить серьезные грабли.
Release только для вызова внутри формы, которую надо уничтожить.
К сожалению многие писатели растиражировали Release не понимая как это работает.


DrPass   (2008-02-08 10:30:00) [20]


> sniknik ©   (08.02.08 01:04) [10]
> > FParentForm.Free;
> для форм Free неправильно, нужно Release. (см. хелп почему)

Почему? Если бы это вызывалось из обработчика событий самой формы, тогда да, Release. А если Free делает невизуальная компонента, которая к форме прямого отношения не имеет (в смысле, через Owner), то Free вполне уместен


Страницы:   1 2

Наверх

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