Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как убить объект из его же метода? [D7]


Страницы:   1 2 3 4 5 6

Ega23 ©   (2007-10-12 13:17:00) 

Собственно, сабж.

Есть идея с PostMesage  WM_DESTROY, но возникает вопрос - а если это не "оеонный" класс?


Kolan   (2007-10-12 14:27:00) [81]

> 2. Где-нибудь потом (не в методе какого-либо класса) сканируем
> этот список и уничтожаем объекты.

В потоке например, который будет этот список без конца сканить и мочить объекты…

Ega,
А может просто сделать интерфейс? Пусть он(объек) сам помрёт когда не нужен будет…


Ins   (2007-10-12 14:11:00) [82]


> С другой стороны непонятна логика. Если после уничтожения
> объекта методу нужно обращаться к полям объекта, то зачем
> тогда уничтожать объект.

Очень много случаев, когда люди вызывают Sender.Free из обработчика события. А потом удивляются AV или abstract error-у. А ведь нет ничего удивительного. Примеры были (правда на другом форуме), могу привести.


palva   (2007-10-12 14:09:00) [83]

palva ©   (12.10.07 14:06) [20]
С другой стороны непонятна логика. Если после уничтожения объекта методу нужно обращаться к полям объекта, то зачем тогда уничтожать объект.


Ins   (2007-10-12 14:09:00) [84]


> если этот метод не обращается к полям.

Это очень важное если. А если этот метод вызван из другого метода, который потом обращается? А если этот другойвызван из третьего? А если где-то потом еще вызывается виртуальный метод (он же тоже подразумевает обращение к self)? Лучше просто так не делать и тогда жить будет чуточку легче.


palva   (2007-10-12 14:06:00) [85]

> но экземпляра, на который указывает self уже нет.
Все это понятно. Но я не уловил, в чем заключается трудности выполнения метода несуществующего объекта, если этот метод не обращается к полям.


Сергей М.   (2007-10-12 14:03:00) [86]


> сервис с пайпами


Ничто не мешает сервису создавать и испольновать окна.


Ins   (2007-10-12 14:00:00) [87]


> Игорь Шевченко ©   (12.10.07 13:58) [17]

Что вас удивляет? В своем же методе (сабж вроде как об этом) вызывать Free небезопасно. После этого вызова метод продолжает выполняться, но экземпляра, на который указывает self уже нет.


Игорь Шевченко   (2007-10-12 13:58:00) [88]


> Убивается, но делать это в методе своего же класса не рекомендуется,
>  так как код метода после этого продолжает выполняться и
> любое обращение к self скорее всего приведет к исключению.
>


????????????????????


Ins   (2007-10-12 13:57:00) [89]


> palva ©   (12.10.07 13:51) [14]

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


Ins   (2007-10-12 13:56:00) [90]


> Ega23 ©   (12.10.07 13:45) [12]

Если там нет ни цикла выборки сообщений, ни окна он создавать не может, то сделать так:
1. Просто заносим ссылку на объект в некий список
2. Где-нибудь потом (не в методе какого-либо класса) сканируем этот список и уничтожаем объекты.


palva   (2007-10-12 13:51:00) [91]

А разве обычным образом объект не убивается? Следующая программа печатает один и тот же адрес. То есть второй раз объект создается на месте убиенного.

{$APPTYPE CONSOLE}
uses Classes;
type
 TMyStringList = class(TStringList)
 procedure Dest;
 end;

procedure TMyStringList.Dest;
begin
 Free;
end;

var
 sl: TMyStringList;
begin
 sl := TMyStringList.Create();
 WriteLn(Integer(sl));
 sl.Dest;
 sl := TMyStringList.Create();
 WriteLn(Integer(sl));
 sl.Dest;
end.


Игорь Шевченко   (2007-10-12 13:50:00) [92]

тебе чего надо-то ?


Ins   (2007-10-12 13:45:00) [93]


> Ega23 ©   (12.10.07 13:42) [7]

[4] не подходит? Централизованно и не нужен никакой Application.


Ega23   (2007-10-12 13:45:00) [94]


> Ну хотя бы один TWinControl-объект будет ?


Похоже что нет, это сервис с пайпами


Сергей М.   (2007-10-12 13:43:00) [95]


> Ega23 ©   (12.10.07 13:42) [7]


Ну хотя бы один TWinControl-объект будет ?


Slym   (2007-10-12 13:43:00) [96]

можно через стандартный TThread и synhronized гасить объект в главном потоке


Ins   (2007-10-12 13:43:00) [97]


> Slym ©   (12.10.07 13:41) [6]

Очень плохой вариант. Его работоспособность зависит от приоритета вызывающего потока - это раз, может привести к исключению на многопроцессорной системе - это два, жрет много ресурсов - это три.


Ega23   (2007-10-12 13:42:00) [98]

Так, с мест сообщают, что Application не будет.


Slym   (2007-10-12 13:41:00) [99]

Ega23 ©   (12.10.07 13:17)
DelayedFree?
procedure DelayedFree(obj:Pointer);
 function ThreadProc(Aobj: Pointer): Integer;stdcall;
 begin
   TObject(Aobj).Free;
 end;
var FHandle,FThreadID:THandle;
begin
 FHandle:=CreateThread(nil,0,@ThreadProc,Pointer(obj),CREATE_SUSPENDED,FThreadID) ;
 SetThreadPriority(FHandle, THREAD_PRIORITY_IDLE);
 ResumeThread(FHandle);
 CloseHandle(FHandle);
end;


Ins   (2007-10-12 13:39:00) [100]

Даже название для класса такого окна вам придумал :) SuicideManagerWindow


Страницы:   1 2 3 4 5 6

Наверх

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