Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Синглетон. Кто его должен удалять?   Найти похожие ветки 

 
Kolan ©   (2007-01-06 18:49) [0]

Здравствуйте,
 Синглетон удобно, создается когда нужен. А кто его удалит? Удобнее имхо в деструкторе главной формы, но тогда форма будет знать окуче ненужных модулей только чтобы удалять объекты.
В finalization может&#133

Короче где вы их удаляете?


 
Джо ©   (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;

То объект сначало создается, потом удаляется&#133
При удалении почему-то не все удаляется и происходит переход на другие finalization.

В итоге Leak + Error 216&#133

С интерфейсом пока нехочу делать&#133


 
Джо ©   (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 с чартом на форме работает&#133


 
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&#133

В итоге сейчас седлал 1 модуль, который знает о всех синглетонах.
Там есть ф-ция DestroySingletons;, и все они убиваются.
А вункция эта вызывается в деструкторе гл. формы
— все ок.



Страницы: 1 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
2-1170273176
valwin
2007-01-31 22:52
2007.02.25
Отрисовка маленького примитива на канве с учётом угла поворота!


15-1170517896
Суслик
2007-02-03 18:51
2007.02.25
Свободный newsgroups client


1-1167904951
Kolan
2007-01-04 13:02
2007.02.25
Иключения в потоке. Как правильно обрабатывать?


2-1170935968
Medved_
2007-02-08 14:59
2007.02.25
Com


4-1160766541
gellmar
2006-10-13 23:09
2007.02.25
Как реализовать парсинг PE64 файлов под win32 на делфи?