![]() |
| ||
|
|
Новости |
Поиск |
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 не должен был завершиться?
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 вполне уместен