Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.042 c
2-1170671273
kail
2007-02-05 13:27
2007.02.25
запуск программы один раз


15-1170110927
SkyRanger
2007-01-30 01:48
2007.02.25
Соло на скасофоне


15-1170332176
апмав
2007-02-01 15:16
2007.02.25
Собрались брать на предприятие лицензионный Delphi


2-1170791635
MSTeam
2007-02-06 22:53
2007.02.25
Меню


2-1170667633
NewComerDS
2007-02-05 12:27
2007.02.25
Как узнать путь файла открытого(используемого) exeшником ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский