![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как убить объект из его же метода? [D7]
Ega23 © (2007-10-12 13:17:00)Собственно, сабж.
Есть идея с PostMesage WM_DESTROY, но возникает вопрос - а если это не "оеонный" класс?
Игорь Шевченко (2007-10-15 15:46:00) [41]Leonid Troyanovsky © (15.10.07 15:40) [63]
> Т.е. (безопасно) уничтожить объект из его же метода нельзя.
>
> Если желание, все же, не проходит, то действовать надо
> в направлении [61].
Можно уничтожить. Если потом не обращаться к уничтоженному объекту :)
Отсюда, собственно и вопрос [62]
Leonid Troyanovsky (2007-10-15 15:40:00) [42]
> Игорь Шевченко © (15.10.07 15:29) [62]
> а нафига, собственно, нужны действия в отквоченном тексте ?
Как мне представляется, это и есть ответ на вопрос из subject.
Т.е. (безопасно) уничтожить объект из его же метода нельзя.
Если желание, все же, не проходит, то действовать надо
в направлении [61].
--
Regards, LVT.
Игорь Шевченко (2007-10-15 15:29:00) [43]Leonid Troyanovsky © (15.10.07 14:06) [61]
> Т.е., если некий объект не может больше работать, то он
>
> должен возбудить исключение (необязательно класса EAbort),
>
> для информирования об этом обстоятельсве того, кто вызвал
>
> метод этого объекта, а уж в обработчике исключений этого
>
> уровня принимать решение о дальнейшей судьбе объекта.
Это я понимаю, выпрямители там, тумбы разные, это нам товарищ ВрИО довольно хорошо объяснил. Но вот один момент до конца не понятен - а нафига, собственно, нужны действия в отквоченном тексте ?
Leonid Troyanovsky (2007-10-15 14:06:00) [44]
> Leonid Troyanovsky © (13.10.07 10:17) [58]
> А чтобы не вводить никого в заблуждение откажемся от FreeObject
> и будем звать непоср-но raise EFreeObject.CreateFO(AObject).
Продвигаемся еще дальше и откажемся от автоматического
разрушения объекта после обработки исключения.
Т.е., если некий объект не может больше работать, то он
должен возбудить исключение (необязательно класса EAbort),
для информирования об этом обстоятельсве того, кто вызвал
метод этого объекта, а уж в обработчике исключений этого
уровня принимать решение о дальнейшей судьбе объекта.
В любом случае, удерживаемая на этом уровне ссылка
на объект может быть обнулена вовремя.
--
Regards, LVT.
Leonid Troyanovsky (2007-10-13 12:31:00) [45]
> Сусл © (13.10.07 11:44) [59]
> tobject.free посмотри
Посмотри остальные 57 сообщений.
--
Regards, LVT.
Сусл (2007-10-13 11:44:00) [46]а в чем проблема убить?
берешь и убиваешь.
tobject.free посмотри
Leonid Troyanovsky (2007-10-13 10:17:00) [47]
> oxffff © (12.10.07 22:32) [57]
> Так что и в этом случае гарантии попаданения в почти в "top
> caller",
Ну, я надеюсь, что уважаемый Ega23 не будет в локальных
обработчиках гасить EAbort.
А чтобы не вводить никого в заблуждение откажемся от FreeObject
и будем звать непоср-но raise EFreeObject.CreateFO(AObject).
--
Regards, LVT.
oxffff (2007-10-12 22:32:00) [48]
> Leonid Troyanovsky © (12.10.07 18:18) [56]
> Тестировалось по-пятничному :)
Я если исключение не дойдет до Application.HandleException(Self)?
Извольте получить AV
procedure TForm1.Button1Click(Sender: TObject);
var A:Tobject;
begin
a:=Tobject.Create;
try
FreeObject(a);
except
end;
showmessage(a.ClassName);
end;
Пример упрощен.
Так что и в этом случае гарантии попаданения в почти в "top caller", т.е MainWndProc нет.
Leonid Troyanovsky (2007-10-12 18:18:00) [49]
> Игорь Шевченко © (12.10.07 15:10) [36]
type
EFreeObject = class(EAbort)
private
FObject : TObject;
public
property AObject: TObject read FObject;
constructor CreateFO(AObject: TObject); virtual;
destructor Destroy; override;
end;
constructor EFreeObject.CreateFO(AObject: TObject);
begin
inherited CreateFmt('Object %p, classname %s', [Pointer(AObject), AObject.ClassName]);
FObject := AObject;
end;
destructor EFreeObject.Destroy;
begin
if (FObject = Application) or
(FObject = Application.MainForm) then
Application.Terminate
else
FObject.Free;
inherited;
end;
procedure FreeObject(AObject: TObject);
begin
raise EFreeObject.CreateFO(AObject);
end;
Тестировалось по-пятничному :)
--
Regards, LVT.
palva (2007-10-12 16:23:00) [50]
> > я очень ценю гибкость Delphi
> Оную твою "любовь" и видно по твоим постам)
А он и не говорил, что любит. Говорил что ценит.
Ценить - это любить за деньги.
oxffff (2007-10-12 15:52:00) [51]
> Сергей М. © (12.10.07 15:49) [53]
>
> > я очень ценю гибкость Delphi
>
>
> Оную твою "любовь" и видно по твоим постам)
День добрый Сергей М. :)
Сергей М. (2007-10-12 15:49:00) [52]
> я очень ценю гибкость Delphi
Оную твою "любовь" и видно по твоим постам)
oxffff (2007-10-12 15:47:00) [53]
> procedure KillAllPendingObject;
> begin
> //проходим по очереди и вызывает Free для каждого элемента
> end;
Freemem естественно.
oxffff (2007-10-12 15:46:00) [54]
> Игорь Шевченко © (12.10.07 15:42) [49]
> oxffff © (12.10.07 15:38) [46]
>
> При всем уважении не могу согласиться :) Чем-то мне это
> напоминает реактор на субтепловых нейтронах и шины из полиаминного
> нестирающегося волокна.
Вы знаете делать можно по разному. Главное чтобы работало.
За это я очень ценю гибкость Delphi.
oxffff (2007-10-12 15:43:00) [55]procedure TXObject.FreeInstance;
begin
CleanupInstance;
PendingQueue.insert(self);
end;
procedure KillAllPendingObject;
begin
//проходим по очереди и вызывает Free для каждого элемента
end;
Игорь Шевченко (2007-10-12 15:42:00) [56]oxffff © (12.10.07 15:38) [46]
При всем уважении не могу согласиться :) Чем-то мне это напоминает реактор на субтепловых нейтронах и шины из полиаминного нестирающегося волокна.
oxffff (2007-10-12 15:40:00) [57]
> oxffff © (12.10.07 15:38) [46]
>
> > Игорь Шевченко © (12.10.07 15:35) [43]
> > на С# надо писать. Там мусор собирается. Сам.
>
>
> Неа. Tobject надо знать. ;)
> Перекрываем FreeInstance оставляем Cleanup.
> И добавляет добавление в очередь на удаление из кучи, которую
> (очередь) можно проверять в отдельном потоке. Вот вам почти
> .NET.
Каким образом до очередной сборки мусора, Обращение к объекту или виртуальному методу во всяком случае не вызовет ошибку.
Ins (2007-10-12 15:39:00) [58]
> Ins © (12.10.07 15:37) [44]
А все из-за того, что обращение к self иногда идет неявно. Как с теми же виртуальными методами. Потом очень долго ищут ошибку.
Игорь Шевченко (2007-10-12 15:38:00) [59]Ins © (12.10.07 15:37) [44]
Практика показывает, что наступают абсолютно на все грабли, на которые только можно наступить, и по несколько раз :)
oxffff (2007-10-12 15:38:00) [60]
> Игорь Шевченко © (12.10.07 15:35) [43]
> на С# надо писать. Там мусор собирается. Сам.
Неа. Tobject надо знать. ;)
Перекрываем FreeInstance оставляем Cleanup.
И добавляет добавление в очередь на удаление из кучи, которую (очередь) можно проверять в отдельном потоке. Вот вам почти .NET.