четверг, 26 декабря 2013 г.

Как я решаю проблему "ленивой инициализации" у "себя"

Как я решаю проблему "ленивой инициализации" у "себя".

По мотивам  - http://programmingmindstream.blogspot.ru/2013/12/blog-post_3160.html

Есть СИСТЕМНЫЙ МЕТОД - l3SystemDown (исходники тут - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/RealWork/L3/l3Base.pas).

Используется он так:

class function TafwImplementation.Application: IafwApplication;
//#UC START# *4775153A0006_47764F3F0064_var*
var
 l_AC : TafwApplicationClass;
//#UC END# *4775153A0006_47764F3F0064_var*
begin
//#UC START# *4775153A0006_47764F3F0064_impl*
{$IfNDef DesignTimeLibrary}
 l_AC := GetApplicationClass;
 if (g_Application <> nil) AND not l3SystemDown then
 begin
  if not g_Application.InheritsFrom(l_AC) then
  begin
   FreeAndNil(g_Application);
   g_Application := l_AC.Create;
  end;//not g_Application.InheritsFrom(l_AC)
 end;//g_Application <> nil
 if (g_Application = nil) AND not l3SystemDown then
 begin
  l3System.AddExitProc(FreeApp);
  g_Application := l_AC.Create;
 end;//g_Application = nil
 Result := g_Application;
{$Else}
 Result := nil;
{$EndIf  DesignTimeLibrary}
//#UC END# *4775153A0006_47764F3F0064_impl*
end;//TafwImplementation.Application
...
procedure RemoveContainer(aCont: Tl3IEBitmapContainer);
begin
 if not l3SystemDown then
 // - не надо ничего удалять в процессе завершения работы, т.к. может оказаться, что и удалять неоткуда 
  if Tl3IEBitmapContainerStack.Exists then
   Tl3IEBitmapContainerStack.Instance.Remove(aCont);
end;
...
function _l3UnknownPrim_.CheckStamp(const aGUID: TGUID): Boolean;
  {-}
begin
 {$IfDef _UnknownNeedL3}
 if l3SystemDown then
  Result := false
 else
  Result := IsEqualGUID(l3System.GetStamp, aGUID);
 {$Else _UnknownNeedL3}
 Result := false;
 {$EndIf _UnknownNeedL3}
end;
...
procedure RemoveResource(const AObject: TvgObject);
var
  Idx: integer;
begin
  if (g_ResourceList <> nil) then
  begin
    try
     Idx := g_ResourceList.IndexOf(AObject);
    except
     on E : Exception do
     begin
      if not l3SystemDown then
       l3System.Exception2Log(E);
      try
       FreeAndNil(g_ResourceList);
      except
       g_ResourceList := nil;
      end;//try..except
      Exit;
     end;//on E : Exception
    end;//try..except 
    if (Idx >= 0) then
     g_ResourceList.Delete(Idx);
     //g_ResourceList[Idx] := nil;
  end;//g_ResourceList <> nil
end;
...
function vtVGSceneResources: TvtVGSceneResources;
begin
 Assert(not l3SystemDown);
 if (vtStdVGSceneResources = nil) then
 begin
  vtStdVGSceneResources := TvtVGSceneResources.Create(nil);
  l3System.AddExitProc(Fini);
 end;//vtStdVGSceneResources = nil
 Result := vtStdVGSceneResources;
end;

И никакого "шаманства"...

Комментариев нет:

Отправить комментарий