![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как убить объект из его же метода? [D7]
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