![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Синглетон. Кто его должен удалять?
Kolan © (2007-01-06 18:49:00)Здравствуйте,
Синглетон удобно, создается когда нужен. А кто его удалит? Удобнее имхо в деструкторе главной формы, но тогда форма будет знать окуче ненужных модулей только чтобы удалять объекты.
Вfinalizationможет
Короче где вы их удаляете?
Kolan (2007-01-06 21:33:00) [1]«Чем не устраивает finalization-то? :)»
Вот менеджер графика например(у меня). Убивает им же созданые серии на чарте. А чарт на форме.
Я механизм точно непонял, но видимо к этому моменту графика уже нет и получается rt error 216
В итоге сейчас седлал 1 модуль, который знает о всех синглетонах.
Там есть ф-цияDestroySingletons;, и все они убиваются.
А вункция эта вызывается в деструкторе гл. формы
все ок.
Джо (2007-01-06 21:11:00) [2]> [12] Kolan © (06.01.07 21:10)
> Видимо лучший вариант завести менеджер, который их централизовано
> замочит. Кто-нить пробовал?
А зачем?
Чем не устраивает finalization-то? :)
Kolan (2007-01-06 21:10:00) [3]Видимо лучший вариант завести менеджер, который их централизовано замочит. Кто-нить пробовал?
Kolan (2007-01-06 20:40:00) [4]Ну ясно. Счетчик.
А почему _CustomMainAPI не поле, а переменная вне класса?
atruhin (2007-01-06 20:15:00) [5]Если не нужны интерфейсы, например так:
TooCustomMainAPI = class
public
constructor Create; reintroduce;
destructor Destroy; override;
class function NewInstance: TObject; override;
procedure FreeInstance; override;
function MainDir: string;
end;
implementation
var
_CustomMainAPI : TooCustomMainAPI = nil;
_CustomMainAPICounter : integer = 0;
constructor TooCustomMainAPI.Create;
begin
Inherited Create; //(nil);
if _CustomMainAPICounter = 1 then begin
.......
end;
end;
destructor TooCustomMainAPI.Destroy;
begin
if _CustomMainAPICounter = 1 then begin
......
end;
inherited;
end;
procedure TooCustomMainAPI.FreeInstance;
begin
dec(_CustomMainAPICounter);
if _CustomMainAPICounter = 0 then begin
_CustomMainAPI := nil;
inherited;
end;
end;
class function TooCustomMainAPI.NewInstance: TObject;
begin
if _CustomMainAPI = nil
then _CustomMainAPI := TooCustomMainAPI(inherited NewInstance);
inc(_CustomMainAPICounter);
Result := _CustomMainAPI;
end;
initialization
_CustomMainAPI := TooCustomMainAPI.Create;
finalization
_CustomMainAPI.Free;
end.
Т.е. объект может где угодно создаваться уничтожаться, но будет одиночным.
Kolan (2007-01-06 19:55:00) [6]«[8] Джо © (06.01.07 19:31)
procedure TGraphManager.DestroyInstance;
begin
if Assigned(FInstance) then
FreeAndNil (FInstance)
end;»
Угу, и сделать DestroyInstance классовой.
А вот с finalization непрокатывает, видимо, из-за того, что TGraphManager с чартом на форме работает
Джо (2007-01-06 19:31:00) [7]> TGraphManager.GetInstance.Free;
> То объект сначало создается, потом удаляется…
Я бы не мучался и сделал в таком роде:
TGraphManager = class
private
FInstance: TGraphManager;
procedure DestroyInstance;
...
end;
...
finalization
TGraphManager.DestroyInstance;
Джо (2007-01-06 19:31:00) [8]
procedure TGraphManager.DestroyInstance;
begin
if Assigned(FInstance) then
FreeAndNil (FInstance)
end;
Kolan (2007-01-06 19:25:00) [9]Вот если объект не создавался и я делаю:
initialization
finalization
TGraphManager.GetInstance.Free;
То объект сначало создается, потом удаляется
При удалении почему-то не все удаляется и происходит переход на другиеfinalization.
В итоге Leak + Error 216
С интерфейсом пока нехочу делать
Kolan (2007-01-06 19:17:00) [10]Те создавать экземпляры нельзя, потому что
TSingletonвimplementation. Ясно.
Джо (2007-01-06 19:11:00) [11]> [2] Kolan © (06.01.07 19:01)
> Что-то не пойму, а как его сделать интерфейсом?
Например, вот так :)
unit Unit2;
interface
type
ISingleton = interface
['{5B59EDFB-CCB5-43BA-98BE-7F5AB680091A}']
procedure Method1;
end;
function GetSingleton: ISingleton;
implementation
uses Classes;
type
TSingleton = class (TInterfacedObject, ISingleton)
private
procedure Method1;
end;
var
FSingleton: ISingleton;
function GetSingleton: ISingleton;
begin
if not Assigned (FSingleton) then
FSingleton := TSingleton.Create;
Result := FSingleton
end;
{ TSingleton }
procedure TSingleton.Method1;
begin
end;
end.
Kolan (2007-01-06 19:02:00) [12]Может вообще неверно?
Kolan (2007-01-06 19:01:00) [13]Что-то не пойму, а как его сделать интерфейсом?
Я удоляю так:
TDeviceProtocolSingleton.GetInstance.Free;
Джо (2007-01-06 18:59:00) [14]> Короче где вы их удаляете?
Я — либо в finalization того модуля, где он объявлен, либо вообще его делаю интерфейсом и он уничножается автоматически :)