Форум: "Основная";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
ВнизСинглетон. Кто его должен удалять? Найти похожие ветки
← →
Kolan © (2007-01-06 18:49) [0]Здравствуйте,
Синглетон удобно, создается когда нужен. А кто его удалит? Удобнее имхо в деструкторе главной формы, но тогда форма будет знать окуче ненужных модулей только чтобы удалять объекты.
Вfinalization
может…
Короче где вы их удаляете?
← →
Джо © (2007-01-06 18:59) [1]> Короче где вы их удаляете?
Я — либо в finalization того модуля, где он объявлен, либо вообще его делаю интерфейсом и он уничножается автоматически :)
← →
Kolan © (2007-01-06 19:01) [2]Что-то не пойму, а как его сделать интерфейсом?
Я удоляю так:
TDeviceProtocolSingleton.GetInstance.Free;
← →
Kolan © (2007-01-06 19:02) [3]Может вообще неверно?
← →
Джо © (2007-01-06 19:11) [4]> [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:17) [5]Те создавать экземпляры нельзя, потому что
TSingleton
вimplementation
. Ясно.
← →
Kolan © (2007-01-06 19:25) [6]Вот если объект не создавался и я делаю:
initialization
finalization
TGraphManager.GetInstance.Free;
То объект сначало создается, потом удаляется…
При удалении почему-то не все удаляется и происходит переход на другиеfinalization
.
В итоге Leak + Error 216…
С интерфейсом пока нехочу делать…
← →
Джо © (2007-01-06 19:31) [7]> TGraphManager.GetInstance.Free;
> То объект сначало создается, потом удаляется…
Я бы не мучался и сделал в таком роде:
TGraphManager = class
private
FInstance: TGraphManager;
procedure DestroyInstance;
...
end;
...
finalization
TGraphManager.DestroyInstance;
← →
Джо © (2007-01-06 19:31) [8]
procedure TGraphManager.DestroyInstance;
begin
if Assigned(FInstance) then
FreeAndNil (FInstance)
end;
← →
Kolan © (2007-01-06 19:55) [9]«[8] Джо © (06.01.07 19:31)
procedure TGraphManager.DestroyInstance;
begin
if Assigned(FInstance) then
FreeAndNil (FInstance)
end;»
Угу, и сделать DestroyInstance классовой.
А вот с finalization непрокатывает, видимо, из-за того, что TGraphManager с чартом на форме работает…
← →
atruhin © (2007-01-06 20:15) [10]Если не нужны интерфейсы, например так:
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 20:40) [11]Ну ясно. Счетчик.
А почему _CustomMainAPI не поле, а переменная вне класса?
← →
Kolan © (2007-01-06 21:10) [12]Видимо лучший вариант завести менеджер, который их централизовано замочит. Кто-нить пробовал?
← →
Джо © (2007-01-06 21:11) [13]> [12] Kolan © (06.01.07 21:10)
> Видимо лучший вариант завести менеджер, который их централизовано
> замочит. Кто-нить пробовал?
А зачем?
Чем не устраивает finalization-то? :)
← →
Kolan © (2007-01-06 21:33) [14]«Чем не устраивает finalization-то? :)»
Вот менеджер графика например(у меня). Убивает им же созданые серии на чарте. А чарт на форме.
Я механизм точно непонял, но видимо к этому моменту графика уже нет и получается rt error 216…
В итоге сейчас седлал 1 модуль, который знает о всех синглетонах.
Там есть ф-цияDestroySingletons;
, и все они убиваются.
А вункция эта вызывается в деструкторе гл. формы
— все ок.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c